加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – asyncio create_connection协议工厂

发布时间:2020-12-20 13:15:48 所属栏目:Python 来源:网络整理
导读:Python 3的asyncio模块中的 create_connection函数将其作为协议工厂的第一个参数.该文档有以下注释: Note protocol_factory can be any kind of callable,not necessarily a class. For example,if you want to use a pre-created protocol instance,you ca
Python 3的asyncio模块中的 create_connection函数将其作为协议工厂的第一个参数.该文档有以下注释:

Note protocol_factory can be any kind of callable,not necessarily a class. For example,if you want to use a pre-created protocol instance,you can pass lambda: my_protocol.

所以你可以使用lambda传递一个实例,如下所示:

create_connection(lambda: Protocol(a,b,c))

另一种方法是定义__call__以返回self,这样您就可以在不定义lambda的情况下传递实例.

protocol = Protocol(a,c)
create_connection(protocol)

有没有理由使用lambda作为文档建议在类上定义__call__?

解决方法

注意这两行之间的区别:

loop.create_connection(MyProtocol,'127.0.0.1',8888)    # Option #1
loop.create_connection(MyProtocol(),8888)  # Option #2

以下是来自asyncio docs的echo客户端示例,经过修改后可与选项#1一起使用:

class MyEchoClientProtocol(asyncio.Protocol):
    def connection_made(self,transport):
        message = "hello"
        transport.write(message.encode())
        print('Data sent: {!r}'.format(message))

    def data_received(self,data):
        print('Data received: {!r}'.format(data.decode()))

    def connection_lost(self,exc):
        print('The server closed the connection')
        print('Stop the event loop')
        loop.stop()


loop = asyncio.get_event_loop()
coro = loop.create_connection(MyEchoClientProtocol,8765)
loop.run_until_complete(coro)
loop.run_forever()
loop.close()

如果您选择使用选项#2,则需要实现MyProtocol .__ call __(self),它适用于MyProtocol的实例.

虽然这可能对create_connection有效,但由于__call__只会被调用一次,所以这对于create_server的protocol_factory参数不起作用:

...
# Each client connection will create a new protocol instance
coro = loop.create_server(EchoServerClientProtocol,8888)
...

这里多次调用protocol_factory来创建新的Protocol实例.使用EchoServerClientProtocol()并定义def __call __(self):return self将只重用一个Protocol实例!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读