【问题标题】:Heroku database management from worker来自worker的Heroku数据库管理
【发布时间】:2018-08-27 11:22:21
【问题描述】:

想知道是否有人可以帮助我或至少指导我正确的方式。

我目前正在运行一个网络和一个工作进程。我需要一个任务在 dynos 在线时 24/7 运行,它的工作是访问数据库并通过根据当前时间戳检查每条记录的“过期”值来删除已过期的记录。

我的 worker.py 文件:

import os
import redis
from rq import Worker, Queue, Connection

listen = ['high', 'default', 'low']

redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')

conn = redis.from_url(redis_url)

if __name__ == '__main__':
    with Connection(conn):
        worker = Worker(map(Queue, listen))
        worker.work()

这如 heroku 文档所示。

然后在我的 app.py 中:

from rq import Queue
from worker import conn
from datetime import datetime

q = Queue(connection=conn)

def myFunction():
    while True:
        for item in Users.query.all():
           if int(item.expiry) < (datetime.now().timestamp()):
               db.session.delete(item)
               db.session.commit()

If __name__ == “__main__”:
    q.enqueue(myFunction)
    app.run()

我的个人资料如下所示:

web: gunicorn app:app
worker: python worker.py

当我运行它时,过期的记录不会从数据库中删除。无论如何我可以解决这个问题或进一步诊断问题吗?

【问题讨论】:

  • 你似乎没有任何东西可以真正使 myFunction 入队。
  • 感谢您的回复。我确实有一些东西要排队,但完全忘记在问题中包含它!谢谢提醒,有空我会修改的。

标签: python heroku redis heroku-postgres


【解决方案1】:

将您的任务排入队列的代码位于__name__ == “__main__” 块内,因此它仅在您的脚本直接运行时运行——例如通过python app.py。但是你通过 procfile 在 Heroku 上运行它,它将它作为一个模块加载到 gunicorn 中——这样代码就永远不会被执行。你需要把它放在别的地方。

请注意,尽管我根本看不出在这里使用 rq 的任何理由。这用于创建在您的 Web 进程排队时动态运行离线任务的工作人员。但是您似乎希望一个功能连续运行; rq 在这里无关紧要,您应该直接通过 procfile 运行该代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多