#python #django #gunicorn
#python #django #gunicorn
Вопрос:
Я настраиваю свой планировщик с помощью apscheduler внутри файла с именем Scheduler.py —
def start_scheduler():
scheduler = BackgroundScheduler()
scheduler.add_job(xyz_job, trigger='cron', hour=21, minute=0)
scheduler.start()
Теперь внутри моего apps.py —
from. Scheduler import start_scheduler
class AppNameConfig(AppConfig):
name = 'appname'
start_scheduler()
Затем из cmd я использую — python manage.py runserver
Мой планировщик работает нормально, и каждый день в 9 вечера планировщик начал работать в фоновом режиме.
PS — Это был API с точками входа и конечной точкой. Я тестировал его с помощью postman. Я получал вывод правильно.
Теперь на моем сервере Linux я делаю то же самое, но вместо использования django я использую gunicorn для предоставления моего API.
Я использую команду — gunicorn -b server_ip:port project.wsgi --workers=2 --daemon
Используя приведенную выше команду gunicorn, мой API все еще работает нормально, и я получаю выходные данные, но мой планировщик не работает.
Кто-нибудь может дать некоторое представление о том, что может быть возможным решением для этого?
Комментарии:
1. В отличие от очень простого встроенного сервера разработки, gunicorn управляет потоками и процессами. Планировщик использует свой собственный поток, и gunicorn может просто завершить этот поток или родительский поток и процесс. Обычно запланированные задания выполняются как команда управления через cron.
2. «xyz_job», упомянутый в сообщении, — это функция, которая заменяет файл pickle, который уже присутствует там, и загружает этот новый файл pickle в переменную. Итак, логично, что если планировщик и gunicorn работают в разных потоках, это не должно препятствовать тому, чего я пытаюсь достичь.
3. Ну, gunicorn не запускается как другой процесс. Он выполняется как родительский процесс всех процессов (и потоков), которые выполняют код (workers). Даже если вы создаете поток и запускаете его в заданное время, с двумя рабочими вы создадите два потока, которые, скорее всего, будут выполнять задачу одновременно, что приведет к состоянию гонки. Вот почему вы никогда не создаете дополнительные потоки в приложениях WSGI.
4. предположим, я даю —worker = 1, теперь gunicorn выполнит код (1 рабочий). Здесь не будет условия гонки, и этот поток будет запускать планировщик в фоновом режиме, а также он будет обслуживать входные данные для API. Но это тоже не работает. P.S. — Я понимаю вашу точку зрения на это условие гонки, потому что ранее я использовал 4 рабочих, и каждый рабочий инициировал это xyz_job (который на самом деле является функцией обучения модели), и были ошибки. Но может быть решением для этого
5. Я не говорил, что он будет работать с одним рабочим, я сказал, что он не будет работать с двумя.