Celery - Какой пул я должен использовать для тяжелого процесса cpu в windows и бэкенда redis для отслеживания состояния?
Я использую python 3.9, Windows 10, celery 4.3, redis в качестве бэкенда и aws sqs в качестве брокера (я не собирался использовать бэкенд, но мне становилось все более очевидным, что из-за ограничений библиотеки на windows мне лучше использовать его, если я смогу заставить его работать, иначе я бы просто использовал redis в качестве брокера и бэкенда).
Чтобы дать вам некоторый контекст, у меня есть веб-страница, с которой взаимодействует пользователь, чтобы позволить ему выполнить ресурсоемкую задачу. Если у пользователя запущена задача и он решает повторно отправить ее, мне нужно, чтобы он убил задачу и использовал новую информацию, отправленную пользователем, для создания новой задачи.
Проблема для меня возникает после такой линии размышлений:
Me: "Hmmm, the prefork pool is used for heavy cpu background tasks... I want to use that..."
Me: Goes and configures settings.py,
updates the celery library,
sets the environment variable to allow windows to run prefork pool -
os.environ.setdefault('FORKED_BY_MULTIPROCESSING', '1'),
sets a few other configuration settings, etc,
runs the worker and it works.
Me: "Hey, hey. It works... Oh, I still can't revoke a task DESPITE RUNNING THE PREFORK POOL!?!?!
Oh, that's okay... I can just set a session variable to let me know if the user already started a task,
and if they have, just have celery tell me if the task that they started is finished
before I allow the user to request to run a task again."
Me: Goes and configures django sessions,
configures redis,
updates the views to include the session variable, etc,
Me: "Great! Everything is working, so far..."
Me: Runs a test to see if the redis server returns the status...
Celery: "PENDING"
Me: "Yo! Is my task done, yet!?"
Celery: "No - PENDING"
Celery: "PENDING"
Celery: "PENDING"
Celery: "PENDING"
Celery: "PENDING"
Celery: "PENDING"
Me: Searches stackoverflow for why its only pending...
Me: Finds out that you must use --pool=solo for the worker...
Me: Dies on the inside.
Идеально - я бы хотел иметь возможность использовать пул prefork для интенсивной обработки и при необходимости завершать задачу. Дело в том, что все, что я читаю, говорит мне, что prefork - это то, что мне нужно, но solo - это единственный способ, который я могу придумать, чтобы заставить его работать.
Вопросы:
Насколько плохо для меня поступиться этими желаниями и просто пойти на соло, ожидая, что я буду использовать тяжелый процессор для задач и много пользователей? Предположительно 100s, если не 1000s.
Какие другие решения мне следует рассмотреть?
По моему опыту на windows я не могу использовать ничего кроме --pool=solo
Какие другие решения мне следует рассмотреть?
Как я это делаю, я использую 1 пул для разработки под windows и больше на производстве (linux), по крайней мере, в моем случае использование одиночного пула для разработки - это нормально.