【发布时间】:2020-10-30 21:56:03
【问题描述】:
我有两个微服务:
- 服务
具有两个端点的 Tornado 服务:/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() 应该可以防止我们这样的阻塞,我错过了什么?
【问题讨论】:
-
await不会自动使您的代码非阻塞。那些 rpc 调用是异步的吗?如果没有,那么这将导致阻塞。 -
@xyres 是的 rpc 调用是同步的。但问题是tornado服务被阻止,而不是grpc服务
-
是的,如果 rpc 调用不是异步的,那么它们将阻塞 tornado 进程(因为您正在从 tornado 进程中进行这些调用)。
-
@xyres 有没有办法“绕过”它有同步 rpc 调用?
标签: asynchronous tornado