Appengine:put_async在开发服务器中不起作用吗?

7

注意:在生产环境中是正常工作的。也就是说,当我上传应用程序时,它可以很好地工作。问题出现在开发服务器上。

以下是一些代码,可以展示我的意图:

e = Employee(key_name = 'some_key_name',name='John Bonham')
db.put_async(e)

如果我这样做了,一段时间后我尝试获取它。
e = Employee.get_by_key_name('some_key_name') # e is None

它不起作用。 e 是 None!但是,如果我这样做:

e = Employee(key_name = 'some_key_name',name='John Bonham')
op = db.put_async(e)
op.get_result()

它的运行很好。

我错过了什么吗?

重要提示:我等待一些时间来检查对象是否已创建!在调用put_async后,我不会再进行get操作。但是,即使等了一分钟,它仍然无法正常工作。我在开发服务器中!


这个 put_async 是在一个事务中吗?你试过在事务中使用它,看看事务阻塞是否会使它像 get_result() 一样工作吗?你能展示更多你实际调用这个函数的代码吗? - Steven Kampen
@Steve 我还没有在事务中尝试过,我一会儿会试试。没有什么可以展示的,使用我发布的“玩具”代码也不起作用。我会尝试使用事务,感谢您的关注。 - santiagobasulto
@Steve,它实际上是在事务中工作的。问题是,如果我需要从不同的实体组中放置对象,它会像put()一样阻止我的执行。这太奇怪了。发生了什么? - santiagobasulto
1个回答

14

如果你在 RPC 上不调用 .wait() 或者 .get_result(),就没有办法保证它已经完成。对于非多线程的 dev_appserver 来说,实际工作是在你调用这些方法时完成的——在开发环境中它并不是真正的异步操作,只有在生产环境中才是。


1
@santiagobasulto 在返回给用户之前,您仍需要等待RPC。如果不这样做,基础架构也会这样做 - 当存在未完成的RPC时,无法返回响应。 - Nick Johnson
1
这种行为在哪里有记录?这里没有提到.wait():https://developers.google.com/appengine/docs/python/datastore/async - user153275
@tom,我不再在App Engine上工作了,所以我不能快速检查,但我不认为它已经改变。不过你可以很容易地自己测试一下! - Nick Johnson
谢谢。@NickJohnson 我该如何测试呢?即如何知道基础设施是否在等待?只需在大量测试中观察响应时间吗? - tom
@tom 做一些你知道很昂贵的事情,比如非常大的输入,然后观察它是否立即返回或需要很长时间。 - Nick Johnson
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接