0

首先我知道我可以使用线程来完成这样的任务,就像这样:

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 的东西,根据他们的文档,你可以使用它们并行执行代码。

Tasklet 是一种在没有线程的情况下编写并发运行的函数的方法;tasklet 由事件循环执行,并且可以使用 yield 语句暂停自己的 I/O 或其他操作阻塞。阻塞操作的概念被抽象到 Future 类中,但 tasklet 也可能产生一个 RPC 以等待该 RPC 完成。

是否可以使用上面的线程完成类似示例的操作?

我已经知道如何使用 get_async() 处理检索实体(从他们在文档页面的示例中获得),但在并行代码执行方面我非常不清楚。

谢谢。

4

1 回答 1

0

答案取决于你的heavy_operation真实身份。如果heavy_operation使用 RPC(Remote Procedure Call,如数据存储访问,UrlFetch,...等),那么答案是肯定的。

如何理解appengine ndb.tasklet? 我问了一个类似的问题,您可以在那里找到更多详细信息。

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

答案

技术上是的,但它不会异步运行。当你用@tasklet 装饰一个非屈服函数时,它的Future 值会在你调用该函数时计算和设置。也就是说,当你调用它时,它会贯穿整个函数。如果你想实现异步操作,你必须屈服于做异步工作的东西。通常在 GAE 中,它会一直运行到 RPC 调用。

于 2014-06-19T17:38:26.943 回答