簡體   English   中英

與NDB Tasklet並行執行python代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM