Python-while循环在扭曲的主循环中?

Python-while循环在扭曲的主循环中?,python,twisted,Python,Twisted,我需要知道是否有可能在扭曲的websocket主循环中运行while循环 我所指的while循环是您在这个问题中看到的库: 我所需要做的就是在它更新后发送新标题,尽管我可以处理这部分。它是在self.running:play()函数中的。如果你能帮忙,我一定会很感激的。为了使Twisted的单线程、协作多任务系统能够最好地运行,在reactor线程中运行的任何特定代码段在没有将控制权交还给reactor的情况下都不能运行太长时间,这一点很重要。只要有一段代码在该线程中运行,就没有其他代码在该线程

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

我所指的while循环是您在这个问题中看到的库:


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

为了使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())
cooperative
获取一个迭代器并对其进行迭代-但不是一次迭代全部。它迭代几次,然后放弃对反应器的控制。然后它再迭代几次,然后再次放弃控制。这一直持续到迭代器耗尽(或反应器停止)

另一个稍微少一点的直译是基于
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
这使您可以控制循环迭代的速率。在本例中,传递到
start
0
表示“尽可能快”(迭代之间等待0秒),同时与系统的其余部分保持协作。如果您希望每秒迭代一次,则将传递
1
,以此类推


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

我想让它检查数据库,但我不想同时运行两个进程