2015-10-14 62 views
3

設置:單apscheduler例如

  • 瓶應用程序通過WSGI有25個線程在Apache的httpd的運行
  • 單WSGI過程:WSGIDaemonProcess myapp threads=25
  • apscheduler運行作業(發送電子郵件)
  • RethinkDB作爲作業商店的後端

我試圖阻止apscheduler從runn通過防止啓動多個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網絡應用程序與多個進程,可以添加/刪除作業,但又阻止調度程序多次運行作業?

+0

我可以通過將mpm_event'StartServers'指令更改爲1來讓httpd只啓動一次進程。但這並不意味着它不會啓動更多進程... – wspeirs

回答

2

我最終選擇使用基於文件的鎖,以確保任務不運行兩次:

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() 

這是一個黑客攻擊的一位,但似乎工作...