如何在调度程序之外添加作业?

2024-10-01 09:42:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的要求。我将apscheduler作为一个单独的进程运行。我有另一个jobproducer脚本,我想在其中向调度程序添加作业并运行它。在

这是我的调度程序代码

# appsched.py
from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler()
scheduler.start()

这是我的工作制作人剧本

^{pr2}$

不用说这没用。这两种方法都可以在商店里工作吗?如何与多个不同的作业生产者共享调度程序?


Tags: frompy程序脚本进程作业blocking调度
1条回答
网友
1楼 · 发布于 2024-10-01 09:42:25

我遇到了一个类似的问题,我的调度进程是一个uWSGI MULE进程,还有一个单独的应用程序,我想在其中添加新的作业。在

看看BaseScheduleradd_job()函数:

with self._jobstores_lock:
if not self.running:
    self._pending_jobs.append((job, jobstore, replace_existing))
    self._logger.info('Adding job tentatively   it will be properly scheduled when the scheduler starts')
else:
    self._real_add_job(job, jobstore, replace_existing, True)

您可以看到问题:调度程序只在已经启动时才添加作业。在

幸运的是,解决方案非常简单,我们应该定义自己的“add job only”调度程序:

^{pr2}$

然后我们可以立即添加cron作业:

jobscheduler = JobAddScheduler()
jobscheduler.add_job(...)

别忘了配置调度程序!在我的例子中,我使用SQLAlchemy MySQL后端存储作业:

jobstores=dict(default=SQLAlchemyJobStore(url='mysql+pymsql://USER:PASSWORD@SERVER/DATABASE'))
jobscheduler.configure(jobstores=jobstores)

我不确定其他的jobstore,但是在我添加了一个新的作业之后,我不得不调用单独调度程序进程的wakeup()函数来“激活”该作业。我用uWSGI的信号系统实现了这一点。在

相关问题 更多 >