我对以下代码有问题。在我的实际情况中,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()
在Python这样的编程语言中,不可能安全地、一般地中断线程。Java曾经有这个特性,但是they removed it,因为它本质上是不安全的。(Java中有一个新特性
Thread.interrupt
,这是一个问题较少的有限版本,但它仍然使编写多线程代码的任务复杂化)。在这就是为什么Twisted提供了很多避免线程的方法。如果你不需要它们,就不要使用它们。例如,不调用}的执行(如果它还没有发生)。在
time.sleep(n); foo()
而只需执行reactor.callLater(n, foo)
,您将获得相同的效果,除了callLater
返回一个对象,您可以使用该对象轻松地取消或推迟{如果你有一个例子,说明你实际上在做什么,而不是用“
time.sleep
”代替“然后发生了什么”,请打开另一个问题来阐述它。答案取决于你在做什么——你真的在等时间吗?阻塞到另一个进程的I/O?另一台机器?Twisted有适合所有这些的设施。在相关问题 更多 >
编程相关推荐