gpt4 book ai didi

python - asyncio create_connection 协议(protocol)工厂

转载 作者:太空宇宙 更新时间:2023-11-03 12:03:07 25 4
gpt4 key购买 nike

create_connection Python 3 的 asyncio 模块中的函数将协议(protocol)工厂作为其第一个参数。该文档有以下注释:

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__ 定义为 return self,这样您就可以在不定义 lambda 的情况下传递实例。

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

是否有任何理由像文档建议的那样使用 lambda 而不是在类上定义 __call__

最佳答案

注意这两行的区别:

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

这是来自 asyncio 文档的 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, '127.0.0.1', 8765)
loop.run_until_complete(coro)
loop.run_forever()
loop.close()

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

尽管这对于 create_connection 可能工作正常,因为您的 __call__ 只会被调用一次,这对于 protocol_factory 参数来说效果不佳的 create_server :

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

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

关于python - asyncio create_connection 协议(protocol)工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41727355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com