python - Flask 应用程序中的单个 apscheduler 实例

标签 python apache httpd.conf apscheduler

设置:

  • 通过 wsgi 在 Apache 的 httpd 中运行的 Flask 应用
  • 具有 25 个线程的单个 wsgi 进程:WSGIDaemonProcess myapp threads=25
  • apscheduler 运行作业(发送电子邮件)
  • RethinkDB 作为作业存储的后端

我试图通过阻止 apscheduler 的多个实例启动来阻止 apscheduler 多次运行同一个作业。目前我正在使用以下代码来确保调度程序只启动一次:

    if 'SCHEDULER' not in app.config or app.config['SCHEDULER'] is None:
        logger.info("Configuring scheduler")
        app.config['SCHEDULER'] = scheduler.configure()

但是,当我查看我的日志时,我看到调度程序被启动了两次:

[07:07:56.796001 pid 24778 INFO] main.py 57:Configuring scheduler
[07:07:56.807977 pid 24778 INFO] base.py 132:Scheduler started
[07:07:56.812253 pid 24778 DEBUG] base.py 795:Looking for jobs to run
[07:07:56.818019 pid 24778 DEBUG] base.py 840:Next wakeup is due at-10-14 11:30:00+00:00 (in 1323.187678 seconds)
[07:07:57.919869 pid 24777 INFO] main.py 57:Configuring scheduler
[07:07:57.930654 pid 24777 INFO] base.py 132:Scheduler started
[07:07:57.935212 pid 24777 DEBUG] base.py 795:Looking for jobs to run
[07:07:57.939795 pid 24777 DEBUG] base.py 840:Next wakeup is due at-10-14 11:30:00+00:00 (in 1322.064753 seconds)

从 pid 可以看出,有两个进程正在某处/以某种方式启动。我怎样才能防止这种情况发生?这个配置在httpd的什么地方?

假设我确实想要运行两个进程,我可以使用 flock 来防止 apscheduler 启动两次。但是,这不会起作用,因为未启动 apscheduler 的进程将无法添加/删除作业,因为 app.config['SCHEDULER'] 设置为该进程使用。

配置/设置 Flask 网络应用程序的最佳方法是什么,该应用程序具有多个进程,可以添加/删除作业,同时防止调度程序多次运行该作业?

最佳答案

我最终决定使用基于文件的锁来确保任务不会运行两次:

def get_lock(name):
    fd = open('/tmp/' + name, 'w')

    try:
        flock(fd, LOCK_EX | LOCK_NB)  # open for exclusive locking
        return fd
    except IOError as e:
        logger.warn('Could not get the lock for ' + str(name))
        fd.close()
        return None


def release_lock(fd):
    sleep(2)  # extend the time a bit longer in the hopes that it blocks the other proc
    flock(fd, LOCK_UN)
    fd.close()

这有点乱,但似乎在工作...

关于python - Flask 应用程序中的单个 apscheduler 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33126524/

相关文章:

python - 使 Python-Telegram-Bot 持久化

python - 在 Python 中获取 Visio 中的形状层

apache - 客户端被服务器配置拒绝 :/opt/bitnami/apps/wordpress/htdocs/

php - 使用非 Apache 用户在非 Apache 端口上运行 PHP 应用程序

apache - Tomcat mod_proxy AJP静态资源目录

python - 从 pd 数据帧获取联合概率

python - 我如何将数据发送到另一个程序并得到它的答案?

linux - 从头开始尝试了 3 次,只达到 HellowWorld cordova run --device

php - 第一个破折号未被识别为分隔符

Apache CXF - 设置 HTTP header