我如何在Twisted中中断线程?

2024-09-24 00:28:18 发布

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

我对以下代码有问题。在我的实际情况中,SomeClass封装的逻辑有阻塞逻辑,所以我需要用reactor.callFromThread()来调用它。我要把这个回路接通跑吧()在我发出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()

Tags: run代码importselffalsetimedef逻辑
1条回答
网友
1楼 · 发布于 2024-09-24 00:28:18

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

这就是为什么Twisted提供了很多避免线程的方法。如果你不需要它们,就不要使用它们。例如,不调用time.sleep(n); foo()而只需执行reactor.callLater(n, foo),您将获得相同的效果,除了callLater返回一个对象,您可以使用该对象轻松地取消或推迟{}的执行(如果它还没有发生)。在

如果你有一个例子,说明你实际上在做什么,而不是用“time.sleep”代替“然后发生了什么”,请打开另一个问题来阐述它。答案取决于你在做什么——你真的在等时间吗?阻塞到另一个进程的I/O?另一台机器?Twisted有适合所有这些的设施。在

相关问题 更多 >