Python while循环在twisted主循环中?

2024-04-20 08:17:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有可能在twisted websocket主循环中运行while循环

im所指的while循环是您在这个问题中看到的库:shout-python segmentation fault how can I fix this?

我只需要它做的是发送新的标题,一旦它更新,虽然我可以处理这部分。它是play()函数中的while self.running:。如果你能帮忙,我一定会很感激的。在


Tags: 函数标题playtwistedthisfixcanwebsocket
1条回答
网友
1楼 · 发布于 2024-04-20 08:17:22

为了让Twisted的单线程、协作多任务系统能够在最佳状态下运行,在reactor线程中运行的任何特定代码段都不能运行太长时间而不将控制权交还给reactor,这一点很重要。只要有一段代码在该线程中运行,就没有其他代码在该线程中运行。在单线程、协同多任务系统中,这意味着其他事件不会被服务。在

根据应用程序的不同,一段代码可以在不放弃控制的情况下运行几毫秒、几秒钟,甚至几分钟。它完全取决于应用程序负责处理的事件以及您希望从中获得的响应级别。在为这样的系统编写通用库代码时,大多数人都认为只有在放弃控制之前,才可以为单个任务运行几毫秒左右的代码,这样做是为了避免在更多的应用程序中使用而不是在更少的应用程序中使用(尽管人们很少考虑确切的时间限制,大多数操作被分为“相当快”和其他操作)。在

几乎总是不可接受的是,在不把控制权交还给反应堆的情况下,无限期地运行一段代码。链接到的答案中的循环实际上是无限的,因此它将控制任意长的一段时间(可能在程序的大部分运行时)。很少有应用程序能够容忍这种情况,因为结果是其他事件永远不会被处理。如果您的应用程序在整个运行时都在处理单个任务时无法响应任何事件,那么您可能根本不需要多任务系统(例如,您可能不需要Twisted,您可以使用while循环)。在

答案中的循环基本上是一个“尽快处理一些数据”的循环。对于这类工作的实现,有一些更适合多任务处理的方式。在

一种方法是将循环直接翻译成对反应堆友好的模式。可以使用生成器执行此操作:

from twisted.internet.task import cooperate

class Audio(object):
    def play(self):
        # ... setup stuff ...
        while self.running:
            # ... one chunk of work ...
            yield

def main():
    ...
    cooperate(Audio().play())

cooperate接受一个迭代器并对其进行迭代-但不是一次全部迭代。它重复几次,然后把控制权交给反应堆。然后它再迭代几次,然后再次放弃控制。这将持续到迭代器耗尽(或反应堆停止)。在

另一个稍微不直接的翻译是基于LoopingCall的,它接管了循环构造的责任,只让您提供循环的主体:

^{pr2}$

这使您可以控制循环迭代的速率。在本例中,传递给00意味着“尽可能快”(迭代之间等待0秒),同时与系统其余部分保持协作。如果您希望每秒进行一次迭代,则需要传递1,以此类推

另一个不太直接的选择是使用数据流抽象(例如,Twisted的原生生产者/消费者系统或更新的tubes库)来建立多任务友好的数据处理管道,这些管道是从链接答案中特定的“读取、处理”循环中进一步抽象出来的。在

相关问题 更多 >