在异步 URL 获取回调中可以执行的操作是否有限制?
我正在尝试异步 URL 获取接口。但是当在生产环境中使用回调时,我得到一个断言错误。
这是由回调函数中的数据存储访问引起的吗?回调函数有什么限制?还有其他不能异步运行的 API 吗?
这是堆栈...
('The Wait() request was interrupted by an exception from another callback:', AssertionError('1',))
Traceback (most recent call last):
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 513, in __call__
handler.post(*groups)
File "/base/data/home/apps/smsmybus/15.344643308619037909/main.py", line 153, in post
self.get()
File "/base/data/home/apps/smsmybus/15.344643308619037909/main.py", line 182, in get
bus.aggregateBusesAsynch(smsBody,self.request.get('SmsSid'),self.request.get('From'))
File "/base/data/home/apps/smsmybus/15.344643308619037909/bus.py", line 296, in aggregateBusesAsynch
rpc.wait()
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 460, in wait
self.__rpc.Wait()
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_rpc.py", line 112, in Wait
rpc_completed = self._WaitImpl()
File "/base/python_runtime/python_lib/versions/1/google/appengine/runtime/apiproxy.py", line 108, in _WaitImpl
rpc_completed = _apphosting_runtime___python__apiproxy.Wait(self)
File "/base/python_runtime/python_lib/versions/1/google/appengine/runtime/apiproxy.py", line 171, in __MakeCallDone
self.__Callback()
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_rpc.py", line 161, in __Callback
self.callback()
File "/base/data/home/apps/smsmybus/15.344643308619037909/bus.py", line 265, in <lambda>
return lambda: handle_result(rpc,stopID,routeID,sid,directionID)
File "/base/data/home/apps/smsmybus/15.344643308619037909/bus.py", line 252, in handle_result
stop.put()
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 893, in put
return datastore.Put(self._entity, rpc=rpc)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 291, in Put
'datastore_v3', 'Put', req, datastore_pb.PutResponse(), rpc)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 194, in _MakeSyncCall
rpc.wait()
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 461, in wait
assert self.__rpc.state == apiproxy_rpc.RPC.FINISHING, repr(self.state)
InterruptedError: ('The Wait() request was interrupted by an exception from another callback:', AssertionError('1',))
I'm experimenting with the asynchronous URL fetch interface. But when callbacks are used on the production environment, I get an AssertionError.
Is this caused by datastore access in the callback function? What limits are there in the callback function? Are there other APIs that cannot run asynchronously?
Here's the stack...
('The Wait() request was interrupted by an exception from another callback:', AssertionError('1',))
Traceback (most recent call last):
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 513, in __call__
handler.post(*groups)
File "/base/data/home/apps/smsmybus/15.344643308619037909/main.py", line 153, in post
self.get()
File "/base/data/home/apps/smsmybus/15.344643308619037909/main.py", line 182, in get
bus.aggregateBusesAsynch(smsBody,self.request.get('SmsSid'),self.request.get('From'))
File "/base/data/home/apps/smsmybus/15.344643308619037909/bus.py", line 296, in aggregateBusesAsynch
rpc.wait()
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 460, in wait
self.__rpc.Wait()
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_rpc.py", line 112, in Wait
rpc_completed = self._WaitImpl()
File "/base/python_runtime/python_lib/versions/1/google/appengine/runtime/apiproxy.py", line 108, in _WaitImpl
rpc_completed = _apphosting_runtime___python__apiproxy.Wait(self)
File "/base/python_runtime/python_lib/versions/1/google/appengine/runtime/apiproxy.py", line 171, in __MakeCallDone
self.__Callback()
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_rpc.py", line 161, in __Callback
self.callback()
File "/base/data/home/apps/smsmybus/15.344643308619037909/bus.py", line 265, in <lambda>
return lambda: handle_result(rpc,stopID,routeID,sid,directionID)
File "/base/data/home/apps/smsmybus/15.344643308619037909/bus.py", line 252, in handle_result
stop.put()
File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/db/__init__.py", line 893, in put
return datastore.Put(self._entity, rpc=rpc)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 291, in Put
'datastore_v3', 'Put', req, datastore_pb.PutResponse(), rpc)
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/datastore.py", line 194, in _MakeSyncCall
rpc.wait()
File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 461, in wait
assert self.__rpc.state == apiproxy_rpc.RPC.FINISHING, repr(self.state)
InterruptedError: ('The Wait() request was interrupted by an exception from another callback:', AssertionError('1',))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
添加我自己的答案只是为了结束这个问题......
尼克是对的。我尝试在请求完成后执行回调。我没有正确使用等待呼叫。
Adding my own answer just to close this out...
Nick was right. I tried to execute the callbacks after the request had completed. I was not using the wait calls correctly.