龙卷风异步端点不起作用

问题描述

我有两个微服务:

  • 服务

龙卷风服务具有两个端点:/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

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