繁体   English   中英

Python-扭曲的主循环内的while循环?

[英]Python - while loop inside twisted main loop?

我需要知道是否有可能在扭曲的websocket主循环中运行while循环

我所指的while循环是您在此问题中看到的lib: shout-python segmentation fault我该如何解决?

我需要做的就是在更新后发送新标题,尽管我可以处理。 while self.running:play()函数中。 如果您能提供帮助,我将不胜感激。

为了使Twisted的单线程协作多任务系统以最佳状态运行,重要的是,在反应堆线程中运行的任何特定代码段都不能运行太长时间而不将控制权交还给反应堆。 只要在该线程中运行任何代码,就不会在该线程中运行其他代码。 在单线程,协作式多任务处理系统中,这意味着不处理其他事件。

根据您的应用程序,运行一段代码而无需花费很多毫秒,几秒钟甚至几分钟的时间来放弃控制可能会很好。 这完全取决于您的应用程序负责处理哪些事件以及您希望从中获得什么级别的响应性。 当为这样的系统编写通用库代码时,大多数人认为在放弃控制之前为单个任务运行代码几毫秒左右是可以的-出于适合更多用途而出错应用程序而不是更少的应用程序(尽管人们很少考虑确切的时间限制,但大多数操作被分为“相当快”和其他所有内容)。

几乎总是不能接受的是无限期地运行单个代码而没有将控制权交还给反应堆。 您链接到的答案中的循环实际上是无限的,因此它将控制任意长时间(可能在程序的大部分运行时)。 几乎没有应用程序可以容忍这种情况,因为结果是永远不会处理其他事件。 如果您的应用程序在整个运行时间都花在单个任务上的情况下无法响应任何事件,那么您可能根本不需要多任务系统(即,您可能不需要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 ,它负责循环的构造,而您只需要提供循环的主体即可:

from twisted.internet.task import LoopingCall

class Audio(object):
    def play(self):
        # ... setup stuff ...

        LoopingCall(self._play_iteration).start(0)

    def _play_iteration(self):
        # ... one chunk of work

这使您可以控制循环的迭代速率。 在此示例中,传递给start0表示“尽可能快”(在两次迭代之间等待0秒)-同时保持与系统其余部分的协作。 如果您想每秒进行一次迭代,则可以传递1 ,依此类推。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM