gpt4 book ai didi

python - 钢铁 worker 工作完成通知

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:06 24 4
gpt4 key购买 nike

我正在编写 python 应用程序,目前托管在 Heroku 上。它处于早期开发阶段,因此我使用带有一个网络测功机的免费帐户。不过,我希望异步完成较繁重的任务,因此我使用 Iron Worker 插件。我已将其全部设置完毕,它可以执行最简单的工作,例如发送电子邮件或不需要将任何数据发送回应用程序的任何操作。问题是:如何将钢铁 worker 的 worker 输出发送回我的应用程序?或者更好的是,我如何通知我的应用程序工作人员已完成工作?

我查看了其他 Iron 解决方案,例如缓存和消息队列,但我唯一能找到的是我可以显式请求工作状态。显然,我不希望我的网络服务轮询工作人员,因为这违背了将任务移至后台的最初目的。我在这里缺少什么?

最佳答案

我发现这个问题在 Google 中的排名很高,因此如果您来到这里希望找到更多详细信息,这就是我最终所做的:

首先,我在应用程序上准备了端点。我的应用程序使用 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并在我的 worker 中使用它:

import sys, json
from sqlalchemy import *
import requests

print "hello_worker initialized, connecting to database..."

payload = None
payload_file = None
for i in range(len(sys.argv)):
if sys.argv[i] == "-payload" and (i + 1) < len(sys.argv):
payload_file = sys.argv[i + 1]
break

f = open(payload_file, "r")
contents = f.read()
f.close()

payload = json.loads(contents)

print "contents: ", contents
print "payload as json: ", payload

db_url = payload['WORKER_DB_URL']

print "connecting to database ", db_url

db = create_engine(db_url)
metadata = MetaData(db)

print "connection to the database established"

users = Table('users', metadata, autoload=True)
s = users.select()

#def run(stmt):
# rs = stmt.execute()
# for row in rs:
# print row

#run(s)

callback_url = payload['WORKER_CALLBACK_URL']
print "task finished, sending post to ", callback_url
r = requests.post(callback_url)
print r.text

所以最后这里没有真正的魔法,唯一重要的是如果您需要在任务完成时通知您的页面,则在有效负载中发送回调 URL。或者,如果您在应用程序中使用端点 url,则可以将端点 url 放入数据库中。顺便提一句。上面的片段还展示了如何连接到工作线程中的 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 和请求,如果您的项目依赖于任何特定版本的库,您应该这样做:

pip "SQLAlchemy", "0.9.1"

关于python - 钢铁 worker 工作完成通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21338216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com