如何在Twisted中断线程?

时间:2012-03-07 03:23:54

标签: python twisted

我遇到以下代码问题。在我的实际情况中,SomeClass封装的逻辑具有阻塞逻辑,因此我需要使用reactor.callFromThread()来调用它。我希望SomeClass.run()中的循环在我发出sigint信号时停止,我的理解是在addSystemEvent钩子中放置一些代码来处理这个问题。我认为这对我理解Python和线程可能比使用Twisted本身更具问题。

from twisted.internet import reactor
import time

class SomeClass():
    def __init__(self):
        self.running = False

    def run(self):
        self.running = True
        while(self.running):
            print('foo')
            time.sleep(5)

    def stop(self):
        print('stopping')
        self.running = False

someClassInstance = SomeClass()

def cleanup():
    someClassInstance.stop()

reactor.addSystemEventTrigger('before', 'shutdown', cleanup)
reactor.callFromThread(someClassInstance.run)
reactor.run()

1 个答案:

答案 0 :(得分:4)

不可能安全地和一般地用Python等编程语言中断线程。 Java曾经拥有此功能,但they removed it因为它本质上不安全。 (Java中有一个新功能,Thread.interrupt,这是一个有限的版本,问题较少,但它仍然使编写多线程代码的任务变得复杂。)

这就是为什么Twisted提供了许多避免线程的方法。如果您不需要它们,请不要使用它们。例如,除了time.sleep(n); foo()返回您可以用来轻松取消或推迟reactor.callLater(n, foo)'的对象之外,您可以获得相同的效果,而不是调用callLater foo。如果尚未发生则执行。

如果你有一个实际尝试做的事情的例子,而不是用“time.sleep”替换“然后发生了什么事情”,请打开另一个问题来解释它。答案真的取决于你在做什么 - 你真的在按时等待吗?阻止I / O到另一个进程?另一台机器? Twisted拥有适合所有这些的适当设施。