简体   繁体   中英

How to make Python apscheduler run in background

I want to make Python apscheduler run in background , here is my code:

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

when I run the command:

look:Python look$ python itger.py

I just got this:

INFO:apscheduler.scheduler:Scheduler started DEBUG:apscheduler.scheduler:Looking for jobs to run DEBUG:apscheduler.scheduler:No jobs; waiting until a job is added INFO:apscheduler.scheduler:Added job "simple_task" to job store "default"

And ps:

ps -e | grep python

I just got 54615 ttys000 0:00.00 grep python

My Problem is how to set the code run in background and I can see it's running or it's print log for every 5 secs so the code show?

BackgroundScheduler runs in a background thread which in this case, I guess, doesn't prevent the application main threat to terminate.

Try add at the end of your application:

 import time

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

... and then terminate your application with CTRL+C.

Threads are no magical way of making code run & managed by the OS. They are local to your process only, and so if that process terminates or dies unexpectantly, so does your Thread.

So the answer to your question is: don't use threads, write your program in a normal fashion so you can invoke it on your commandline, and then use a OS-based scheduler such as CRON to schedule it.

Alternatively, if your program needs to run continuously because it eg builds up caches that are expensive to re-compute every 5 minutes, use a process-observer such as supervisord to ensure even after a reboot or crash the program continues executing.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM