Tornado 异步端点不起作用
Tornado async endpoint does not works
我有两个微服务:
- 一项服务
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 服务
gRPC 服务与 rpc FooBar
rpc FooBar
def FooBar(...):
return requests.get("/bar")
如果客户端在服务中命中端点/foo
:
- 代码命中 b 服务中的 rpc FooBar
- FooBar rpc 无法命中 服务 中的
/bar
端点,因为该服务已被阻止。
AFAIK,使用 x=await test() 应该可以防止我们出现这种阻塞,我错过了什么?
由于 rpc 调用不是异步的,它会阻塞 Tornado 进程。
您可以通过 运行 在单独的线程中调用 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
我有两个微服务:
- 一项服务
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 服务
gRPC 服务与 rpc FooBar
rpc FooBar
def FooBar(...):
return requests.get("/bar")
如果客户端在服务中命中端点/foo
:
- 代码命中 b 服务中的 rpc FooBar
- FooBar rpc 无法命中 服务 中的
/bar
端点,因为该服务已被阻止。
AFAIK,使用 x=await test() 应该可以防止我们出现这种阻塞,我错过了什么?
由于 rpc 调用不是异步的,它会阻塞 Tornado 进程。
您可以通过 运行 在单独的线程中调用 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