我有一个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/