我遇到以下代码问题。在我的实际情况中,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()
答案 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拥有适合所有这些的适当设施。