首先,我知道我可以使用线程来完成这样的任务,如下所示:
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
但是,在谷歌应用引擎中有一些叫做ndb tasklets的东西,根据他们的文档,你可以使用它们并行执行代码。
Tasklets是一种无需编写并发运行函数的方法 线程; tasklet由事件循环执行,可以暂停 他们自己使用yield来阻止I / O或其他一些操作 声明。阻塞操作的概念被抽象为 未来的类,但是一个tasklet也可能产生一个RPC,以便等待 那个RPC要完成。
是否可以通过上面的线程实现类似的例子?
我已经知道如何使用get_async()处理检索实体(从doc页面上的示例中获取)但在并行代码执行方面我很不清楚。
感谢。
答案 0 :(得分:0)
答案取决于你heavy_operation
到底是什么。如果heavy_operation
使用RPC(远程过程调用,例如数据存储访问,UrlFetch等),那么答案是肯定的。
在 how to understand appengine ndb.tasklet? 我问了一个类似的问题,你可能会在那里找到更多细节。
我可以在函数中放入任何类型的代码并将其装饰为ndb.tasklet吗?然后将其用作异步功能。或者它必须是appengine RPC?
答案
技术上是,但它不会异步运行。使用@tasklet装饰非屈服函数时,会在调用该函数时计算并设置其Future的值。也就是说,当你调用它时,它会遍历整个函数。如果要实现异步操作,必须完成异步工作。通常在GAE中它将一直用于RPC调用。