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

gRPC 服务与 rpc FooBar

rpc FooBar

def FooBar(...):
   return requests.get("/bar")

如果客户端在服务中命中端点/foo

  1. 代码命中 b 服务中的 rpc FooBar
  2. 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