2015-08-16 41 views
1

我想在後臺的Python apscheduler跑,跑到這裏是我的代碼:如何使Python apscheduler背景

from apscheduler.schedulers.background import BackgroundScheduler, BlockingScheduler 
from datetime import datetime 
import logging 
import sys 

logging.basicConfig(level=logging.DEBUG, stream=sys.stdout) 

def singleton(cls, *args, **kw): 
    instances = {} 

    def _singleton(*args, **kw): 
     if cls not in instances: 
      instances[cls] = cls(*args, **kw) 
     return instances[cls] 

    return _singleton 

@singleton 
class MyScheduler(BackgroundScheduler): 
    pass 

def simple_task(timestamp): 
    logging.info("RUNNING simple_task: %s" % timestamp) 

scheduler = MyScheduler() 
scheduler.start() 

scheduler.add_job(simple_task, 'interval', seconds=5, args=[datetime.utcnow()]) 

當我運行命令:

look:Python look$ python itger.py 

我剛剛得到這個:

信息:apscheduler.scheduler:計劃開始 DEBUG:apscheduler.scheduler:尋找工作運行 DEBUG:apscheduler.scheduler:沒有作業;等到一個作業添加 信息:apscheduler.scheduler:新增就業 「simple_task」 求職商店 「默認」

和PS:

ps -e | grep python 

我剛剛54615 ttys000 0:00.00 grep python

我的問題是如何設置代碼在後臺運行,我可以看到它正在運行,或者它每5秒打印日誌,所以代碼顯示?

回答

1

BackgroundScheduler運行在後臺線程,在這種情況下,我猜,不會阻止應用程序的主要威脅終止。

試加在你的應用程序的結束:

import time 

print("Waiting to exit") 
while True: 
    time.sleep(1) 

...然後終止與CTRL + C您的應用程序。

1

線程不是由操作系統管理的代碼運行&的神奇方式。它們只對你的過程是本地的,所以如果該過程終止或意外死亡,你的線程也是如此。

因此,您的問題的答案是:不要使用線程,以正常方式編寫程序,以便可以在命令行上調用它,然後使用基於OS的調度程序(例如CRON)來調度它。

或者,如果您的程序需要連續運行,因爲它例如建立高速緩存,每5分鐘重新計算一次,使用supervisord等進程觀察器確保重新啓動或崩潰後程序繼續執行。

相關問題