Stop a thread: flag vs. Event(停止线程:标志与事件)
本文介绍了停止线程:标志与事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我看到了e.g. here使用Event停止线程的示例,我认为布尔标志可以完成此工作。
活动
class MyThread(threading.Thread):
def __init__(self):
self._please_stop = threading.Event()
def run(self):
while not self._please_stop.is_set():
[...]
def stop(self):
self._please_stop.set()
旗帜
class MyThread(threading.Thread):
def __init__(self):
self._please_stop = False
def run(self):
while not self._please_stop:
[...]
def stop(self):
self._please_stop = True
在这里使用Event有什么好处?未使用其wait方法。有什么比布尔标志更好的?
如果相同的Event在多个线程之间共享,我可以理解这一点,但在其他情况下,我无法理解。
This mailing list thread建议Event会更安全,但我不清楚原因。
更准确地说,我不理解这两段话:
如果我对GIL的理解正确,它会将所有访问同步到 Python数据结构(例如我的布尔值‘Terminated’标志)。如果是这样的话 既然如此,何必为此费心使用线程化。事件? GIL是一个实现细节,并依赖于它进行同步 对你来说,事情并不是未来的证据。你可能会有很多 警告,但是使用threading.Event()并不难,而且更难 从长远来看,这是正确和安全的。
我同意使用Event几乎不会增加任何开销,因此我可以坚持这一点,但我想了解FLAG方法的局限性。
(我使用的是Python3,所以我并不担心Python2的限制(如果有),尽管这些限制在这里完全值得一提。)
推荐答案
我认为您引用的线程中的含义是设置布尔值不一定是atomic在Python中的操作。虽然在所有Python对象(GIL)上设置全局锁会使所有设置属性的操作暂时看起来原子,但这样的锁将来可能不会存在。使用Event使操作成为原子操作,因为它使用自己的锁进行访问。
原子的链接指向一个Java问题,但它的相关性并不因此而降低。
这篇关于停止线程:标志与事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
编程基础网
本文标题为:停止线程:标志与事件
基础教程推荐
猜你喜欢
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- 尝试制作WhatsApp机器人 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
