gpt4 book ai didi

python - 我如何在 Twisted 中中断线程?

转载 作者:太空狗 更新时间:2023-10-30 03:06:06 25 4
gpt4 key购买 nike

我在使用以下代码时遇到问题。在我的真实情况下,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com