У меня есть проект Django, который состоит из четырех отдельных процессов Heroku. Procfile включен здесь:
jobs: python manage.py sync_hacker_news
web: gunicorn project.wsgi --log-file -
rqworker_default: python manage.py run_worker
rqworker_high: python manage.py run_worker --high
web
запускает веб-сервер, а rq_worker_*
запускает рабочие очереди Redis с высоким и низким приоритетом для асинхронных задач. jobs
является проблемной задачей. Он отвечает за вызов следующей команды управления:
import logging
from apscheduler.schedulers.background import BackgroundScheduler
from django.core.management.base import BaseCommand
from django_apscheduler.jobstores import (DjangoJobStore, register_events,
register_job)
from subscriptions import autocomplete
from subscriptions.notifications import schedule
scheduler = BackgroundScheduler()
scheduler.add_jobstore(DjangoJobStore(), "default")
logger = logging.getLogger(__name__)
@register_job(scheduler, "interval", minutes=5)
def async_hacker_news_sync():
logger.info("Sync new data from Hacker News API.")
autocomplete.get_accounts.delay()
schedule.delay()
class Command(BaseCommand):
help = "Sync usernames and notifications with Hacker News."
def handle(self, *args, **kwargs):
register_events(scheduler)
scheduler.start()
print("Scheduler started!")
Моя цель состоит в том, чтобы эта команда регистрировала задачу с помощью django_apscheduler
для запроса API HackerNews каждые 5 минут.
Проблема заключается в том, чточто после выполнения этой команды она завершается (что ожидается) и приводит к вызову SIGINT
. Это также приводит к закрытию задач web
и rq_worker_*
.
(venv) jamestimmins@Jamess-MBP-3 ~/P/hacker-subscribe-prod> heroku local -p 8000
[OKAY] Loaded ENV .env File as KEY=VALUE Format
6:46:01 PM web.1 | [2019-10-20 18:46:01 -0700] [59366] [INFO] Starting gunicorn 19.9.0
6:46:01 PM web.1 | [2019-10-20 18:46:01 -0700] [59366] [INFO] Listening at: http://0.0.0.0:8000 (59366)
6:46:01 PM web.1 | [2019-10-20 18:46:01 -0700] [59366] [INFO] Using worker: sync
6:46:01 PM web.1 | [2019-10-20 18:46:01 -0700] [59371] [INFO] Booting worker with pid: 59371
6:46:02 PM rqworker_default_0.1 | 01:46:02 Worker rq:worker:959d04ce19ae41d3a81dd3e7903ac7a2: started, version 1.1.0
6:46:02 PM rqworker_default_0.1 | 01:46:02 *** Listening on default...
6:46:02 PM rqworker_high_0.1 | 01:46:02 Worker rq:worker:96b0c75c435b44f3be0bb1ab9ea2f322: started, version 1.1.0
6:46:02 PM rqworker_high_0.1 | 01:46:02 *** Listening on high...
^C[WARN] Interrupted by User
[DONE] Killing all processes with signal SIGINT
6:46:06 PM rqworker_default_0.1 | 01:46:06 Warm shut down requested
6:46:06 PM rqworker_high_0.1 | 01:46:06 Warm shut down requested
6:46:06 PM rqworker_high_0.1 | 01:46:06 Cold shut down
6:46:06 PM web.1 | [2019-10-20 18:46:06 -0700] [59366] [INFO] Handling signal: int
6:46:06 PM rqworker_default_0.1 | 01:46:06 Cold shut down
6:46:06 PM web.1 | [2019-10-21 01:46:06 +0000] [59371] [INFO] Worker exiting (pid: 59371)
6:46:06 PM rqworker_default_0.1 Exited Successfully
6:46:06 PM rqworker_high_0.1 Exited Successfully
6:46:06 PM web.1 | [2019-10-20 18:46:06 -0700] [59366] [INFO] Shutting down: Master
6:46:06 PM web.1 Exited Successfully
Кто-нибудь видел эту проблему раньше, или есть способ запустить несколько процессов, один из которых завершается, не вызывая другиевыключить?