[英]Single apscheduler instance in Flask application
建立:
WSGIDaemonProcess myapp threads=25
我試圖通過防止apscheduler的多個實例啟動來阻止apscheduler多次運行相同的作業。 目前我正在使用以下代碼來確保調度程序僅啟動一次:
if 'SCHEDULER' not in app.config or app.config['SCHEDULER'] is None:
logger.info("Configuring scheduler")
app.config['SCHEDULER'] = scheduler.configure()
但是,當我查看我的日志時,我看到調度程序啟動了兩次:
[07:07:56.796001 pid 24778 INFO] main.py 57:Configuring scheduler
[07:07:56.807977 pid 24778 INFO] base.py 132:Scheduler started
[07:07:56.812253 pid 24778 DEBUG] base.py 795:Looking for jobs to run
[07:07:56.818019 pid 24778 DEBUG] base.py 840:Next wakeup is due at-10-14 11:30:00+00:00 (in 1323.187678 seconds)
[07:07:57.919869 pid 24777 INFO] main.py 57:Configuring scheduler
[07:07:57.930654 pid 24777 INFO] base.py 132:Scheduler started
[07:07:57.935212 pid 24777 DEBUG] base.py 795:Looking for jobs to run
[07:07:57.939795 pid 24777 DEBUG] base.py 840:Next wakeup is due at-10-14 11:30:00+00:00 (in 1322.064753 seconds)
從pid可以看出,有兩個進程正在某處/以某種方式啟動。 我怎么能阻止這個? httpd中的這個配置在哪里?
假設我確實想要運行兩個進程,我可以使用flock
來防止apscheduler重啟兩次。 但是,這不起作用,因為不啟動apscheduler的進程將無法添加/刪除作業,因為app.config['SCHEDULER']
設置為該進程使用。
使用多個進程配置/設置Flask Web應用程序的最佳方法是什么,這些進程可以添加/刪除作業,但卻阻止調度程序多次運行作業?
我最終決定使用基於文件的鎖來確保任務不會運行兩次:
def get_lock(name):
fd = open('/tmp/' + name, 'w')
try:
flock(fd, LOCK_EX | LOCK_NB) # open for exclusive locking
return fd
except IOError as e:
logger.warn('Could not get the lock for ' + str(name))
fd.close()
return None
def release_lock(fd):
sleep(2) # extend the time a bit longer in the hopes that it blocks the other proc
flock(fd, LOCK_UN)
fd.close()
這有點像黑客,但似乎工作......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.