使用thriftpy2时出现一个令人困惑的问题,这是我的代码:
async def callcentre(response, kwargs):
client = await make_aio_client(
echo_client.Dispather, '127.0.0.1', 8080
)
print(type(client))
res = await client.tagsInfo(response, json.dumps(kwargs))
return json.loads(res)
客户端类型为:
<class 'thriftpy2.contrib.aio.client.TAsyncClient'>
但是当我删除等待时:
async def callcentre(response, kwargs):
client = make_aio_client(
echo_client.Dispather, '127.0.0.1', 8080
)
print(type(client))
res = await client.tagsInfo(response, json.dumps(kwargs))
return json.loads(res)
客户端类型为:
<class 'generator'>
因为我无法致电rpc的服务
为什么它返回不同类型的对象?
答案 0 :(得分:0)
这是因为make_aio_client
是协程,而不仅仅是常规的python函数。从python 3.5开始,async
关键字表示该函数是协程:
async def make_aio_client(...):
...
常规函数调用实际上不会执行,只是为您创建一个协程。
client = make_aio_client(...
粗略地说,协程只是生成器(yield
结果的函数)。这就是为什么它的类型是generator
。
您必须使用await
关键字来安排事件循环中的执行:
client_coro = make_aio_client(
echo_client.Dispather, '127.0.0.1', 8080
)
client = await client_coro()
阅读asyncio manual,以了解更多有关协程和等待者的信息。