python make_aio_client返回不同类型的对象

时间:2019-01-11 07:32:57

标签: python

使用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的服务

为什么它返回不同类型的对象?

1 个答案:

答案 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,以了解更多有关协程和等待者的信息。