4

我想让 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

我刚得到这个:

INFO:apscheduler.scheduler:Scheduler 已启动 DEBUG:apscheduler.scheduler:正在寻找要运行的作业 DEBUG:apscheduler.scheduler:No jobs; 等到添加作业 INFO:apscheduler.scheduler:将作业“simple_task”添加到作业存储“默认”

和ps:

ps -e | grep python

我刚得到54615 ttys000 0:00.00 grep python

我的问题是如何设置代码在后台运行,我可以看到它正在运行,或者它每 5 秒打印一次日志,所以代码显示?

4

2 回答 2

3

BackgroundScheduler在后台线程中运行,我猜在这种情况下,它不会阻止应用程序主要威胁终止。

尝试在应用程序末尾添加:

 import time

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

...然后使用 CTRL+C 终止您的应用程序。

于 2015-08-16T06:32:38.017 回答
2

线程并不是让操作系统运行和管理代码的神奇方式。它们仅对您的进程是本地的,因此如果该进程意外终止或终止,您的线程也会如此。

因此,您的问题的答案是:不要使用线程,以正常方式编写程序,以便您可以在命令行上调用它,然后使用基于操作系统的调度程序(例如 CRON)来调度它。

或者,如果您的程序需要连续运行,例如因为它建立了每 5 分钟重新计算一次代价高昂的缓存,请使用进程观察器(例如 supervisord)来确保即使在重新启动或崩溃后程序继续执行。

于 2015-08-16T09:31:18.647 回答