来自 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 编写代码。
想知道是否有人可以帮助我或至少指导我正确的方法。
我目前有一个网络和一个工作进程 运行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 编写代码。