- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在使用以下代码时遇到问题。在我的真实情况下,SomeClass封装的逻辑有阻塞逻辑,所以需要用reactor.callFromThread()
来调用。当我发出 sigint 信号时,我希望 SomeClass.run() 中的循环停止,我的理解是在 addSystemEvent Hook 中放置一些代码来执行此操作应该可以处理这个问题。我认为这可能是我对 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
返回一个您可以轻松使用的对象取消或推迟 foo
的执行,如果它还没有发生的话。
如果您有一个示例来说明您实际上正在尝试做什么,而不是用“time.sleep
”代替“然后发生某些事情”,请打开另一个阐述它的问题。答案实际上取决于您在做什么 - 您真的在准时等待吗?阻塞另一个进程的 I/O?另一台机器? Twisted 为所有这些提供了适当的设施。
关于python - 我如何在 Twisted 中中断线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9595365/
我是一名优秀的程序员,十分优秀!