【发布时间】:2021-03-25 03:58:43
【问题描述】:
我有一个使用 uwsgi(有 10 个工作人员)+ ngnix 运行的 django 应用程序。我正在使用 apscheduler 进行调度。每当我安排一个作业时,它都会被执行多次。从这些答案ans1,ans2 我知道这是因为调度程序是在 uwsgi 的每个工作人员中启动的。我通过按照answer 中的建议将调度程序绑定到套接字并在数据库中保持状态,从而对调度程序进行了条件初始化,这样只会启动调度程序的一个实例,但仍然存在同样的问题,有时也存在创建作业时,发现调度程序未运行,作业保持挂起且未执行。
我正在使用以下代码在 django 应用程序的 url 中初始化 apscheduler。这将在应用程序启动时启动调度程序。
def job_listener(ev):
print('event',ev)
job_defaults = {
'coalesce': True,
'max_instances': 1
}
scheduler = BackgroundScheduler(job_defaults=job_defaults, timezone=TIME_ZONE, daemon=False)
scheduler.add_jobstore(MongoDBJobStore(client=client), 'default')
scheduler.add_executor(ThreadPoolExecutor(), 'default')
scheduler.add_executor(ProcessPoolExecutor(),'processpool')
scheduler.add_listener(job_listener)
def initialize_scheduler():
try:
if scheduler_db_conn.find_one():
print('scheduler already running')
return True
scheduler.start()
scheduler_db_conn.save({'status': True})
print('---------------scheduler started --------------->')
return True
except:
return False
我使用以下代码来创建作业。
from scheduler_conf import scheduler
def create_job(arg_list):
try:
print('scheduler status-->',scheduler.running)
job = scheduler.add_job(**arg_list)
return True
except:
print('error in creating Job')
return False
我无法正确配置和运行调度程序。我已经参考了apschedule中的所有线程,但仍然没有解决方案。
- 如果我不限制在每个工作人员中运行多个调度程序,则作业会执行多次。
- 但是,如果我限制在一个工作器中只运行一个调度程序,一些作业会保持挂起并且不会执行。
解决办法是什么?
【问题讨论】:
标签: django uwsgi apscheduler