gpt4 book ai didi

python - python asyncio 中协议(protocol)工厂的要求是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 00:46:10 25 4
gpt4 key购买 nike

我正在查看 UDP echo server 的示例:

import asyncio

class EchoServerProtocol:
def connection_made(self, transport):
self.transport = transport

def datagram_received(self, data, addr):
message = data.decode()
print('Received %r from %s' % (message, addr))
print('Send %r to %s' % (message, addr))
self.transport.sendto(data, addr)

loop = asyncio.get_event_loop()
print("Starting UDP server")
# One protocol instance will be created to serve all client requests
listen = loop.create_datagram_endpoint(
EchoServerProtocol, local_addr=('127.0.0.1', 9999))
transport, protocol = loop.run_until_complete(listen)

try:
loop.run_forever()
except KeyboardInterrupt:
pass

transport.close()
loop.close()

好像是调用...

loop.create_datagram_endpoint(EchoServerProtocol, local_addr=('127.0.0.1', 9999))

...在这里完成所有工作。 method documentation第一个参数 (protocol_factory) 声明如下:

protocol_factory must be a callable returning a protocol instance.

我的问题:

  • 什么定义了协议(protocol)实例
  • 返回一个协议(protocol)实例启动一个协议(protocol)对象是否是不同的措辞?
  • 示例中的EchoServerProtocol是如何实现这个需求的?

最佳答案

什么定义了协议(protocol)实例

协议(protocol)是您定义的一个类,它实现了 Protocols section 中定义的接口(interface)之一。 ,即为一组回调提供实现,例如Connection Callbacks .

因此对于您发布的 UDP 回显服务器示例,EchoServerProtocol 用户定义类实际上通过实现 connection_made 定义了一个协议(protocol)。和 datagram_received .

总而言之,如果您在一个类中实现其中一个回调,就可以说您定义了一个Protocol。因此该类的一个实例/对象将是一个协议(protocol)实例


返回协议(protocol)实例启动协议(protocol)对象的不同措辞吗?

正式。在您返回一个协议(protocol)实例之前,您应该已经初始化它。所以基本上一个是另一个的先决条件。


例子中的EchoServerProtocol是如何实现这个需求的?

首先,正如第一个问题所回答的,EchoServerProtocol 定义了一个协议(protocol)。因此接下来要做的是提供一个protocol_factory,即defined。作为:

protocol_factory must be a callable returning a protocol instance.

所以为了满足这个要求,你可以有这个简单的方法:

def my_protocol_factory():
return EchoServerProtocol()

注意,这个工厂首先初始化协议(protocol)实例,然后返回它。

所以在这个例子中可能会让你感到困惑的是 EchoServerProtocol 类本身作为 protocol_factory 传递,但是如果你总结一下我所说的,你会看到 EchoServerProtocol 实际上是一个可调用的,当它被调用时,即 EchoServerProtocol() 它实际上初始化了一个 EchoServerProtocol 实例,并且返回它。

是的,这个例子满足了要求。


关于python - python asyncio 中协议(protocol)工厂的要求是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39494332/

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