gpt4 book ai didi

python - Python 的 Twisted Reactor 是如何工作的?

转载 作者:IT老高 更新时间:2023-10-28 21:00:32 24 4
gpt4 key购买 nike

最近,我一直在研究 Twisted 文档。从我收集到的信息来看,Twisted 功能的基础是其称为“ react 器”的事件循环的结果。 react 器监听某些事件并将它们分派(dispatch)到已注册的回调函数,这些回调函数旨在处理这些事件。在书中,有一些伪代码描述了 Reactor 的作用,但我无法理解它,这对我来说没有任何意义。

 while True:
timeout = time_until_next_timed_event()
events = wait_for_events(timeout)
events += timed_events_until(now())
for event in events:
event.process()

这是什么意思?

最佳答案

如果它不明显,它被称为 react 器,因为它对
事物。循环是它的 react 方式。

一次一行:

while True:

它实际上不是 while True ;更像是 while not loop.stopped .您可以调用 reactor.stop()停止循环,并且(在执行一些关闭逻辑之后)循环实际上将退出。但它在示例中被描述为 while True因为当你编写一个长期存在的程序时(就像你经常使用 Twisted 那样),最好假设你的程序要么崩溃要么永远运行,并且“干净地退出”并不是一个真正的选择。
     timeout = time_until_next_timed_event()

如果我们稍微扩展一下这个计算,它可能更有意义:
def time_until_next_timed_event():
now = time.time()
timed_events.sort(key=lambda event: event.desired_time)
soonest_event = timed_events[0]
return soonest_event.desired_time - now
timed_events是用 reactor.callLater 安排的事件列表;即应用程序要求 Twisted 在特定时间运行的功能。
     events = wait_for_events(timeout)

这里的这一行是 Twisted 的“魔法”部分。我无法扩展 wait_for_events一般来说,因为它的实现取决于操作系统如何使所需的事件可用。而且,鉴于操作系统是复杂而棘手的野兽,我无法以特定方式对其进行扩展,同时保持足够简单以回答您的问题。

这个函数的意思是,要求操作系统或它周围的 Python 包装器阻塞,直到一个或多个先前向它注册的对象 - 至少,诸如监听端口和已建立的连接之类的东西,但也可能会被点击的按钮之类的东西 - 是“准备工作”。当它们从网络到达时,工作可能是从套接字中读取一些字节。当缓冲区足够清空以执行此操作时,工作可能会向网络写入字节。它可能正在接受新连接或处理关闭的连接。这些可能的事件中的每一个都是 react 器可能对您的对象调用的函数: dataReceived , buildProtocol , resumeProducing等,如果您阅读完整的 Twisted 教程,您将了解这些内容。

一旦我们得到了假设的“事件”对象列表,每个对象都有一个假想的“ process”方法(由于历史事故, react 堆中方法的确切名称不同),然后我们返回处理时间:
     events += timed_events_until(now())

首先,这是假设 events只是一个 list摘要 Event类,它有一个 process每种特定类型的事件需要填写的方法。

此时,循环已经“唤醒”了,因为 wait_for_events ,停止阻塞。但是,我们不知道根据它“休眠”了多长时间,我们可能需要执行多少个定时事件。如果没有发生任何事情,我们可能已经睡了完全超时,但如果有很多连接处于事件状态,我们可能根本没有睡。所以我们检查当前时间(“ now()”),然后我们添加到我们需要处理的事件列表中,每个定时事件都带有 desired_time即在当前时间或之前。

最后,
     for event in events:
event.process()

这只是意味着 Twisted 遍历它必须做的事情列表并执行它们。实际上,它当然会处理每个事件周围的异常,并且 react 器的具体实现通常只是直接调用事件处理程序而不是创建 Event -like object 来记录需要首先完成的工作,但从概念上讲,这正是发生的事情。 event.process这里可能意味着调用 socket.recv()然后 yourProtocol.dataReceived结果,例如。

我希望这个扩展的解释可以帮助你理解它。如果您想通过研究了解更多关于 Twisted 的信息,我鼓励您 join the mailing list , 跳转到 IRC channel , #twisted谈应用或 #twisted-devFreenode 上处理 Twisted 本身.

关于python - Python 的 Twisted Reactor 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35111265/

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