[英]Executing python code in parallel with ndb tasklets
首先,我知道我可以使用線程來完成此類任務,如下所示:
import Queue
import threading
# called by each thread
def do_stuff(q, arg):
result = heavy_operation(arg)
q.put(result)
operations = range(1, 10)
q = Queue.Queue()
for op in operations:
t = threading.Thread(target=do_stuff, args = (q,op))
t.daemon = True
t.start()
s = q.get()
print s
但是,在Google App Engine中,有一個叫做ndb tasklet的東西,根據它們的文檔,您可以使用它們並行執行代碼。
Tasklet是一種編寫沒有線程的並發運行函數的方法。 Tasklet由事件循環執行,並可以使用yield語句暫停自身對I / O或其他操作的阻塞。 阻塞操作的概念被抽象到Future類中,但是Tasklet可能還會產生一個RPC,以等待該RPC完成。
是否可以通過上面的線程完成類似示例的操作?
我已經知道如何使用get_async()處理檢索的實體(從文檔頁面的示例中獲取了它),但是對於並行代碼執行,對我來說還不清楚。
謝謝。
答案取決於您真正的heavy_operation
操作。 如果heavy_operation
使用RPC(遠程過程調用,例如數據存儲訪問,UrlFetch等),則答案是肯定的。
在如何了解appengine ndb.tasklet? 我問了類似的問題,您可能會在這里找到更多詳細信息。
我可以在函數中放入任何類型的代碼並將其裝飾為ndb.tasklet嗎? 然后將其用作異步功能。 還是必須是appengine RPC?
答案
從技術上講是可以的,但不會異步運行。 當您使用@tasklet裝飾非收益函數時,將在調用該函數時計算並設置其Future的值。 也就是說,當您調用它時,它將貫穿整個函數。 如果要實現異步操作,則必須屈服於執行異步工作的對象。 通常,在GAE中,它將一直進行到RPC調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.