【发布时间】:2017-06-26 04:43:58
【问题描述】:
由于一些不寻常的限制,我需要在返回响应之前同步等待来自另一个服务的回调 URL。目前我有类似的东西:
ROUTE = '/operation'
async def post(self):
##SOME OPERATIONS##
post_body = { 'callbackUrl' : 'myservice.com/cb' }
response = await other_service.post('/endpoint')
global my_return_value
my_return_value = None
while not my_return_value:
pass
return self.make_response(my_return_value)
然后我有一种方法来处理回调 URL,例如:
ROUTE = '/cb'
async def post(self):
##OPERATIONS###
global my_return_value
my_return_value = some_value
return web.json_response()
此代码的问题在于,即使调用了回调 URL,它也会永远被困在 while 循环中。我怀疑有更好的方法可以做到这一点,但我不知道如何去做,也不知道如何用谷歌搜索它。有什么想法吗?
提前致谢!
【问题讨论】:
-
可能有更好的方法可以做到这一点,但我认为您的直接问题是您在回调路由中缺少
global my_return_value。 -
那么为什么不让
other_service.post()返回一个(some_value, web.json_response())元组呢? -
你会得到一个无限循环,因为你在调用帖子后设置了
my_return_value = None。您的协同程序仍然是连续的,/operationpost()协同程序在response = await other_service.post('/endpoint')返回之前不会继续。 -
@MartijnPieters 我相信
other_service.post(...)调用正在发出 HTTP 请求(然后返回),而在其他服务转身并向我们返回 HTTP 请求之前不会调用回调. -
@smarx 是正确的
标签: python-3.x python-asyncio aiohttp