- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写 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/
我正在编写 python 应用程序,目前托管在 Heroku 上。它处于早期开发阶段,因此我使用带有一个网络测功机的免费帐户。不过,我希望异步完成较繁重的任务,因此我使用 Iron Worker 插件
我正在尝试使用 scrapy 创建一个 Iron.io 工作线程。 根据iron.io的说法,我们需要将代码的所有依赖项放置在worker本身中。 我创建了一个名为 module 的文件夹,其中包含所
我可能在这里遗漏了一些非常明显的东西,但是可用于将 Node 与 Iron Worker 一起使用的文档仍然非常有限。 所以我已经很好地创建了我的工作线程,但是我无法弄清楚有效负载传递给任务后会发生什
我是一名优秀的程序员,十分优秀!