与ndb tasklets并行执行python代码

时间:2014-06-19 10:04:00

标签: python google-app-engine tasklet

首先,我知道我可以使用线程来完成这样的任务,如下所示:

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页面上的示例中获取)但在并行代码执行方面我很不清楚。

感谢。

1 个答案:

答案 0 :(得分:0)

答案取决于你heavy_operation到底是什么。如果heavy_operation使用RPC(远程过程调用,例如数据存储访问,UrlFetch等),那么答案是肯定的。

how to understand appengine ndb.tasklet? 我问了一个类似的问题,你可能会在那里找到更多细节。

  

我可以在函数中放入任何类型的代码并将其装饰为ndb.tasklet吗?然后将其用作异步功能。或者它必须是appengine RPC?

答案

  

技术上是,但它不会异步运行。使用@tasklet装饰非屈服函数时,会在调用该函数时计算并设置其Future的值。也就是说,当你调用它时,它会遍历整个函数。如果要实现异步操作,必须完成异步工作。通常在GAE中它将一直用于RPC调用。