如何使用 __init__ 函数创建服务器协议 class?
How can I create a server Protocol class with an __init__ function?
我有 Twisted 背景,所以我对 Twisted 实现的协议和工厂有深入的了解。但是,我正在切换到 asyncio,我在理解工厂如何集成到这个特定框架中时遇到了一些麻烦。
在 official documentation 中,我们有一个服务器 asyncio.Protocol
class 定义的示例。它没有用户定义的 __init__
函数,因此我们可以简单地调用 loop.create_server(EchoServerClientProtocol, addr, port)
.
如果我们的 Protocol
需要实现一些初始化逻辑会怎样?例如,考虑这个设置最大缓冲区大小的示例:
import asyncio
from collections import deque
class BufferedProtocolExample(asyncio.Protocol):
def __init__(self, buffsize=None):
self.queue = deque((), buffsize)
# ...
在 Twisted 中,您将创建一个 Factory
class 来保存所有配置值,然后将其传递给初始化连接的函数。 Asyncio seems to work in the same way,但我找不到任何文档。
我可以使用functools.partial
,但是处理这种情况的正确方法是什么?
文档has an example where they use a lambda for this, so my guess is that functools.partial is fine. They also state that protocol_factory
can be any callable。因此,要拥有类似 Twisted 工厂的东西,您只需要在 class 上实现 __call__
,就像您在 Twisted 中实现 buildProtocol
一样。
我有 Twisted 背景,所以我对 Twisted 实现的协议和工厂有深入的了解。但是,我正在切换到 asyncio,我在理解工厂如何集成到这个特定框架中时遇到了一些麻烦。
在 official documentation 中,我们有一个服务器 asyncio.Protocol
class 定义的示例。它没有用户定义的 __init__
函数,因此我们可以简单地调用 loop.create_server(EchoServerClientProtocol, addr, port)
.
如果我们的 Protocol
需要实现一些初始化逻辑会怎样?例如,考虑这个设置最大缓冲区大小的示例:
import asyncio
from collections import deque
class BufferedProtocolExample(asyncio.Protocol):
def __init__(self, buffsize=None):
self.queue = deque((), buffsize)
# ...
在 Twisted 中,您将创建一个 Factory
class 来保存所有配置值,然后将其传递给初始化连接的函数。 Asyncio seems to work in the same way,但我找不到任何文档。
我可以使用functools.partial
,但是处理这种情况的正确方法是什么?
文档has an example where they use a lambda for this, so my guess is that functools.partial is fine. They also state that protocol_factory
can be any callable。因此,要拥有类似 Twisted 工厂的东西,您只需要在 class 上实现 __call__
,就像您在 Twisted 中实现 buildProtocol
一样。