工人的Heroku数据库管理

时间:2018-03-18 23:19:30

标签: python heroku redis heroku-postgres

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

我目前正在运行Web和工作进程。我需要一个任务在dynos在线时全天候运行,它的工作是访问数据库并通过检查每个记录的“到期”值与当前时间戳来删除已过期的记录。

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

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

1 个答案:

答案 0 :(得分:0)

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

请注意,虽然我在这里看不到任何使用rq的原因。这用于创建在Web进程排队时动态运行脱机任务的工作程序。但是你似乎想要一个功能连续运行; rq与此无关,您应该直接通过procfile运行该代码。