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.
我的问题:
- 什么定义了
protocol instance
?
returning a protocol instance
是 initiating a protocol object
的不同措辞吗?
- 示例中的
EchoServerProtocol
是如何满足这个要求的?
什么定义了协议实例?
协议是您定义的 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 是它。
是的,示例满足要求。
我正在看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 instance
? returning a protocol instance
是initiating a protocol object
的不同措辞吗?- 示例中的
EchoServerProtocol
是如何满足这个要求的?
什么定义了协议实例?
协议是您定义的 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 是它。
是的,示例满足要求。