Python脚本重新启动。为什么?

时间:2017-12-13 16:58:43

标签: python asynchronous process scheduled-tasks apscheduler

我有一个Python脚本,每天运行大约16个小时,并在一天的特定时间安排多个特定的工作。每当使用这个脚本时,通常在运行几个小时(可能是7个小时)后,它会突然启动第二个实例并再次安排所有作业,这意味着每个作业连续执行两次

我正在使用Python 3.6.3,apscheduler,sqlalchemy和其他一些库。我在想,也许我对BackgroundScheduler的误解可能是以下代码示例末尾的问题或while子句:

这是一个简化的代码示例。

import time
from datetime import datetime, timedelta, date

import telepot
from apscheduler.schedulers.background import BackgroundScheduler

from sqlalchemy import create_engine, asc
from sqlalchemy.orm import sessionmaker

... (code omitted for readability)

EDIT:(addition of jobA method)

def jobA(Session, var):
     print("job A")

     session = Session()
     entity = session.query(Entity).filter(...).first()
     try:
          all = method(entity,...)
    except:
        print("Exception was thrown")
        session.commit()
        session.close()
        return []

     session.commit()
     session.close()
     return all

def jobB(...):
    ... 
def jobC(...):
    ...

if __name__ == "__main__":
ENGINE = create_engine(DB)
Session = sessionmaker(bind=ENGINE)

Loggers.http_console_debug()

   ...
TelegramBot = telepot.Bot(Constants.BOT_TOKEN)
TelegramBot.sendMessage(chat_id=Constants.CHAT_ID, text="Started\n")


   ...
try:
    scheduler = BackgroundScheduler(use_reloader=False)
    scheduler.start()

    i = 1
    for var in data:
        i += 1
        ...

        start_date_time = datetime.combine(var.date, var.time)
        #
        scheduler.add_job(jobA, 'date', 
                          run_date=start_date_time - timedelta(minutes=15), args=[Session, var])
        scheduler.add_job(jobB, 'date', 
                          run_date=start_date_time - timedelta(minutes=10), args=[Session, var])

        scheduler.add_job(jobC, 'date',
                          run_date=start_date_time - timedelta(minutes=3), args=[Session, var])

        scheduler.add_job(jobD, 'date',
                          run_date=start_date_time + timedelta(minutes=11), args=[Session, var])

    print(scheduler.get_jobs())
except:
    print("Exception has been thrown")


session.commit()
session.close()


while True:
    time.sleep(1)
    sys.stdout.flush()

当我从命令行提示符或pycharm运行它时,会发生这种情况。运行pgrep时,它会产生有趣的结果。:

pgrep python

程序启动后,它返回一个进程号。然而,几个小时后它返回两个独立的进程。这意味着Python脚本现在运行两次。没有任何人的意见。

简而言之,我的Python脚本在运行时无缘无故地第二次启动,我试图找出如何防止这种情况发生,并改变它以便脚本在一段时间内只运行一次,只安排一次工作。

非常感谢你。

编辑:老实说,我不知道是什么原因导致这个脚本在另一个进程中第二次启动它。我发现这是用于apscheduler的一个例子,我正在研究修复这个重启自身的错误。

这是我用作使用APScheduler的灵感的链接。(基于日期的调度程序) https://pythonadventures.wordpress.com/2013/08/06/apscheduler-examples/

0 个答案:

没有答案