问题描述
我有两个微服务:
- 服务
龙卷风服务具有两个端点:/foo
和/bar
/foo
async def get(...):
x = await test()
return x
async def test():
y = call to b service,FooBar rpc
return y
/bar
def get(...):
return True
- b服务
带有rpc FooBar
的gRPC服务
rpc FooBar
def FooBar(...):
return requests.get("/bar")
如果客户端在服务中击中端点/foo
:
- 代码在 b服务中击中rpc FooBar
- FooBar rpc无法访问服务中的
/bar
端点,因为该服务已被阻止。
AFAIK使用 x = await test()应该可以防止我们被阻止,这是我遗漏的?
解决方法
由于rpc调用不是异步的,它将阻止龙卷风进程。
您可以通过在单独的线程中运行rpc调用来避免阻塞主进程。
首先,使test()
方法成为常规函数,而不是协程(删除async
关键字)。
示例代码:
async def get(...):
x = await IOLoop.current().run_in_executor(None,test)
return x
# regular function,not async
def test(...):
# make calls
return x