python asyncio 中协议工厂的要求是什么?

What are the requirements of a protocol factory in python asyncio?

我正在看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.

我的问题:

什么定义了协议实例

协议是您定义的 class,它实现了 Protocols section, i.e. provides implementations for a set of callbacks, e.g. Connection Callbacks 中定义的接口之一。

因此对于您发布的 UDP 回显服务器示例,EchoServerProtocol 用户定义 class 实际上通过实现 connection_made and datagram_received.

定义了一个协议

总而言之,如果您在 class 中实现其中一个回调,则称您正在定义 Protocol。因此 class 的 instance/object 将是一个 协议实例 .


returning 协议实例启动协议对象的不同措辞吗?

正式。在你return一个协议实例之前,你会初始化它。所以基本上一个是另一个的先决条件。


示例中的EchoServerProtocol是如何满足这个要求的?

所以首先,正如第一个问题所回答的那样,EchoServerProtocol 定义了一个协议。因此接下来的事情是提供一个 protocol_factory,即 defined 为:

protocol_factory must be a callable returning a protocol instance.

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

def my_protocol_factory():
    return EchoServerProtocol()

请注意,该工厂首先初始化协议实例,然后return初始化它。

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

是的,示例满足要求。