簡體   English   中英

Flask應用程序中的單個apscheduler實例

[英]Single apscheduler instance in Flask application

建立:

  • Flask應用程序通過wsgi在Apache的httpd中運行
  • 單個wsgi進程有25個線程: WSGIDaemonProcess myapp threads=25
  • apscheduler來運行工作(發送電子郵件)
  • RethinkDB作為工作存儲的后端

我試圖通過防止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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM