Python,Apscheduler 问题——作业运行两次而不是一次

Posted

技术标签:

【中文标题】Python,Apscheduler 问题——作业运行两次而不是一次【英文标题】:Python, Apscheduler issue -- Job running twice instead of once 【发布时间】:2013-10-03 17:00:17 【问题描述】:

我正在使用 python 构建一个项目。我必须安排一些工作,所以我正在使用 apscheduler。调度程序在 Windows Apache 上运行良好。但是,当我将项目移动到 Amazon Ubuntu 实例时,我遇到了一个问题,即所有作业都在一定的时间间隔后运行,而不是一次运行两次。所以我有每个作业的两个实例同时运行。在 Windows 实例上一切正常……我正在使用 wsgi-python。 下面是我的wsgi文件..

import os
import sys

sys.path.append('C:/Django/sweetspot/src/sweetspot')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings_server'

from jobs.FeedAndNews import FeedParse, NewsParse
from apscheduler.scheduler import Scheduler

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

today = datetime.datetime.today()
nex = datetime.timedelta(hours=1)
startsat = today + nex
timestr = startsat.strftime("%Y-%m-%d %H:%M:%S")   

scheduler = Scheduler()
scheduler.start()

scheduler.add_interval_job(FeedParse, hours=1, start_date=timestr)
scheduler.add_interval_job(NewsParse, hours=1, start_date=timestr)

以下是python和apcheduler的版本: 蟒蛇2.7, apscheduler-2.1.1

有人可以帮我找出问题所在。感谢您的帮助。提前谢谢..

【问题讨论】:

我在 urls.py 中添加了调度程序代码,并从 wsgi.py 中删除了它。现在作业正在运行一次,但在我提供它们的一半间隔后再次运行,即如果我给 1 小时,它会在半小时后启动同一作业的另一个实例...... 您确实意识到,在 UNIX 上,如果使用 Apache/mod_wsgi,您的 WSGI 应用程序可以同时在多个进程中运行。如果您只依赖一个进程,就像在 Windows 上一样,那么您需要适当地配置 Apache/mod_wsgi。最有可能使用 mod_wsgi 守护进程模式。见code.google.com/p/modwsgi/wiki/ProcessesAndThreading 【参考方案1】:

有两种不同的方法可以在不停止多处理的情况下解决这个问题。

--第一个是使用锁定机制。您可以创建一个充当共享资源的文件,并且哪个进程首先打开它,它可以在其中写入一个锁定字符,这样只有一个进程会实际运行作业。

--其次,我们可以将作业与所有其他代码分开。我们可以做的是我们可以创建 cron 作业,这样作业不会影响服务器重启。

【讨论】:

以上是关于Python,Apscheduler 问题——作业运行两次而不是一次的主要内容,如果未能解决你的问题,请参考以下文章

列出 apscheduler 安排的 cron 作业

APScheduler轻量级定时任务框架

Python任务调度模块APScheduler

python中的apscheduler模块

python使用apscheduler实现定时任务

Heroku apscheduler:安排 URL 请求的 cron 作业