钢铁工人工作完成通知

2024-09-30 22:20:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写python应用程序,目前正在Heroku上托管。它处于早期开发阶段,所以我使用免费帐户与一个网络动态。不过,我希望我的较重任务异步完成,所以我使用了IronWorker附加组件。我已经设置好了,它可以做最简单的工作,比如发送电子邮件或任何不需要将任何数据发送回应用程序的工作。问题是:如何将工人输出从钢铁工人发送回我的应用程序?或者更好的是,如何通知我的应用程序工作人员已完成工作?在

我研究了其他铁的解决方案,比如缓存和消息队列,但是我唯一能找到的就是我可以显式地请求worker状态。显然,我不想让我的web服务轮询工作人员,因为这有点违背了将任务移动到后台的最初目的。我错过了什么?在


Tags: 数据网络应用程序消息heroku电子邮件组件动态
2条回答

我发现这个问题在谷歌很高,所以如果你带着希望找到更多细节的希望来到这里,我最后要做的是:

首先,我在我的应用程序上准备了端点。我的应用程序使用Flask,因此代码如下所示:

@app.route("/worker", methods=["GET", "POST"])
def worker():
#refresh the interface or whatever is necessary
    if flask.request.method == 'POST':
        return 'Worker endpoint reached'
    elif flask.request.method == 'GET':
        worker = IronWorker()
        task = worker.queue(code_name="hello", payload={"WORKER_DB_URL": app.config['WORKER_DB_URL'],
                            "WORKER_CALLBACK_URL": app.config['WORKER_CALLBACK_URL']})
        details = worker.task(task)
        flask.flash("Work queued, response: ", details.status)
        return flask.redirect('/')

注意,在我的例子中,GET只用于测试,我不希望我的用户访问这个端点并调用任务。但我可以想象这样做确实有用的情况,特别是如果您不使用任何类型的调度程序来执行任务。在

在端点准备好之后,我开始寻找从工作者那里访问该端点的方法。我发现了这个fantastic requests library,并用在我的工人身上:

^{pr2}$

所以最后这里没有真正的魔力,唯一重要的是在任务完成时通知页面时在有效负载中发送回调url。或者,如果在应用程序中使用端点url,则可以将其放置在数据库中。顺便说一句,上面的截图还显示了如何连接到您的worker中的postgresql数据库并打印所有用户。在

最后需要注意的是如何格式化.worker文件,我的文件如下所示:

# set the runtime language. Python workers use "python"
runtime "python"
# exec is the file that will be executed:
exec "hello_worker.py"
# dependencies
pip "SQLAlchemy"
pip "requests"

这将安装最新版本的SQLAlchemy和requests,如果您的项目依赖于库的任何特定版本,则应改为执行以下操作:

pip "SQLAlchemy", "0.9.1"

最简单的方法-将消息从worker推送到api-它是日志或任何你需要在你的应用中的东西

相关问题 更多 >