2014-01-24 36 views
1

我正在編寫當前在Heroku上託管的python應用程序。它處於早期開發階段,所以我使用一個網絡測試儀免費帳戶。不過,我希望我的重任務能夠異步完成,所以我使用了鐵工附加組件。我已經完成了所有設置,並且執行最簡單的工作,例如發送電子郵件或任何不需要將任何數據發送迴應用程序的任何工作。問題是:我如何將工作者輸出從鐵工人員發回我的應用程序?或者更好的是,我如何通知我的應用程序該工作人員完成了這項工作?鐵工作業完成通知

我看了看其他的鐵解決方案,如緩存和消息隊列,但我能找到的唯一的事情是,我可以明確要求工作者狀態。很明顯,我不希望我的Web服務來調查工作人員,因爲它有些挫敗了將任務轉移到背景的原始目的。我在這裏錯過了什麼?

回答

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('/') 

注意,在我的情況下,得到的是這裏只是爲了測試,我不希望我的用戶打這個端點,並調用任務。但是我可以想象這種情況實際上是有用的,特別是如果您不爲任務使用任何類型的調度程序。

與端點準備好了,我開始尋找訪問端點從工作人員的一種方式。我發現這個fantastic requests library和我的員工使用它:

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放置在數據庫中。順便說一句。上面的剪切也顯示瞭如何連接到你的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的和要求的最新版本,如果你的項目依賴在任何特定版本的庫上,您應該這樣做:

pip "SQLAlchemy", "0.9.1" 
-1

最簡單的方法 - 推送消息到您的API從工人 - 這是你需要在你的應用程序日誌或任何

+0

您能否提供一些更多詳細信息?我可以推送什麼樣的消息?基本代碼示例可能? – lawicko