我有一个Flask应用程序,它使用APS(高级python调度程序)来处理通过(S)FTP传输文件。当我使用Werkzeug进行测试时,这非常有用。当我使用CherryPy进行测试时,这非常有用。当我和Gunicorn一起测试时,这很有用。但是,当我使用Nginx + CherryPy或Gunicorn反向代理进行测试时,作业已安排但从未运行。可以唤醒调度程序,停止/启动调度程序,暂停和恢复作业,但它们永远不会运行,我不知道从哪里开始调试。
APS设置如下:
DEFAULT_MISFIRE_GRACETIME = 10800 # seconds
DEFAULT_URL = 'sqlite:///myapp/var/db/jobs.sqlite.db'
MAX_JOB_INSTANCES = 1
THREADS = 20
COALESCE = True
jobstores = {
'default': SQLAlchemyJobStore(url=DEFAULT_URL)
}
executors = {
'default': ThreadPoolExecutor(THREADS)
}
job_defaults = {
'coalesce': COALESCE,
'max_instances': MAX_JOB_INSTANCES,
'misfire_grace_time': DEFAULT_MISFIRE_GRACETIME
}
scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors,
job_defaults=job_defaults, timezone=pytz.utc)
scheduler.start()
和作业被安排如下(其中“when”是一个日期时间对象,“rid”和“sid”是整数ID,前者是发送的东西的ID,后者是服务的ID它将被发送)
trigger = DateTrigger(when, timezone=pytz.utc)
callable_ = 'myapp.core.task.models:Worker.xmit_files'
id_ = 'xmit_{}_{}'.format(rid, sid)
name = 'Transmit files for id {} to service id {}'.format(rid, sid)
kwargs = {'rid': rid, 'sid': sid}
job = scheduler.add_job(callable_,
kwargs=kwargs, id=id_,
trigger=trigger, name=name)
并且发送的位看起来像这样......
class Worker:
@staticmethod
def xmit_files(rid=None, sid=None):
from myapp.app import create_app
app = create_app()
with app.app_context():
svc = myapp.core.service.models.Service.get(sid)
rsh = Rdata.query.get(rid) # SQLAlchemy
svc.xmit(rsh)
...
(为了清晰起见,完全检查,记录,尝试/除了块除外。)同样,只要它不在Nginx后面运行,这一点工作正常,但是只要它落后于Nginx作业,但是从未运行。我认为执行作业的过程绝不应该与Nginx相互作用。这可能与要求Flask应用程序上下文有关吗? (只是一个猜测。我真的不知道。)