来自 worker 的 Heroku 数据库管理

Heroku database management from worker

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

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

我的 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

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

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

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