我在Heroku上有一个Python Flask应用程序,用于提供网页,但也允许启动某些任务,我相信这些任务最适合作为后台任务 . 因此,我按照Heroku rq tutorial设置了后台任务 . 我的Procfile看起来像这样:
web: python app.py
worker: python worker.py
但是,我的流程目前已缩放 web=1 worker=0
. 鉴于这个背景过程对我来说似乎是明智的,我可以为它配置一个完整的dyno,然后为那么小的东西支付34美元/月 .
Question:
-
如果我在我的Procfile中声明了
worker
进程,但是将缩放保持在web=1 worker=0
,我的排队进程最终是否会在我的可用web dyno上运行?或者排队的进程永远不会运行? -
如果排队的进程永远不会运行,还有另一种方法可以做到这一点,例如,在我的Web应用程序中使用
twisted
来异步运行任务吗?
Additional Information
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()
排队进程的主应用程序中的逻辑如下所示:
from rq import Queue
from worker import conn
q = Queue(connection=conn)
q.enqueue(myfunction, myargument)
4 回答
我目前只使用1个dyno在Heroku中运行我的web和后端调度程序 .
想法是为Heroku提供一个主要的python脚本,以1 dyno开始 . 此脚本用于启动Web服务器进程和客户调度程序进程 . 然后,您可以定义作业并将其添加到自定义计划程序 .
在我的案例中使用APScheduler .
这就是我做的:
在Procfile中:
在run_app.py中:
我也使用了4个工作进程来为Gunicorn提供网络服务 - 运行得非常好 .
在gunicorn.conf.py中:
您可能想要签出此项目作为示例:Zjobs@Github
您可以使用流程管理器,例如god或monit .
有了上帝,你可以像这样设置你的配置
然后你把它放在你的Procfile中
默认情况下,如果进程崩溃,它会自动重新启动进程,如果内存使用率过高,您可以将其配置为重新启动应用程序 . 查看文档 .
您应该看一下Heroku Scheduler它将允许您按计划的时间间隔(例如每10分钟)运行一个特定的任务 . 如果您已经有工作人员设置,则可以添加: