python – asyncio create_connection协议工厂
Python 3的asyncio模块中的
create_connection函数将其作为协议工厂的第一个参数.该文档有以下注释:
所以你可以使用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__只会被调用一次,所以这对于 ... # 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实例! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |