【问题标题】:python locking and threading concurrency [duplicate]python锁定和线程并发[重复]
【发布时间】:2013-06-18 12:29:07
【问题描述】:

我有一个关于 python 锁和线程的问题,我意识到锁用于防止变量被另一个线程覆盖,使用锁来解决这个问题是否正常,因为这意味着你只能运行一个线程同时,这也意味着为每个可能被覆盖的变量创建获取/释放锁,这在我的项目中遇到了很多!

人们是如何做到这一点的?将变量包装在线程安全列表中,或者根据线程名称创建唯一变量?或者每个人都在使用锁获取和释放来乱扔代码?

【问题讨论】:

  • 奇怪的是,这是作为副本关闭的,因为提到的问题根本没有引用 python。是的,大多数编程语言都有许多共同的考虑因素,但有些语言比其他语言对线程更友好,并且每种语言都有自己的怪癖(例如,@nosklo 告诉我们的 Python 的 GIL)。因此,专注于 python 的答案很有价值。
  • 上述问题中没有任何内容是特定于 python 的。此外,这个问题很宽泛而且提出得不好,所以关闭的原因几乎是无关紧要的。

标签: python python-multithreading locks


【解决方案1】:

最好的办法是根本不使用线程。大多数 Python 实现都有一个全局解释器锁,它首先消除了使用线程的优势。如果您使用线程来等待 IO,如果您只使用异步 IO 代替,您可以获得相同或更好的性能。如果您使用线程来跨处理器执行计算(数字运算),python 全局锁会阻止它工作,因此您最好使用多个进程。

与没有优势相比,python 中的线程有很多缺点和警告,就像您已经发现的那样。您仍然必须进行数据共享控制,并处理与在您无法控制的时刻接收 cpu 关注的线程相关的异常情况。所有这些都没有任何好处。

TL;DR 只是不要使用线程

【讨论】:

  • 好的,谢谢,所以总结一下尝试使用多处理而不是线程,因为它回避了对 GIL 的要求,是吗?
  • @Paul 如果您需要多核数字运算,那么可以。如果您需要等待输入/输出,那么只需在单个线程/进程中使用异步 IO。
  • 线程没有好处是不正确的。当您有大量状态要在任务之间共享时,请使用线程。在您不使用的地方使用多处理,并且分叉的开销很高(例如,当您需要在进程之间共享许多 kb 的状态时)。这是核心 python 贡献者youtube.com/watch?v=Bv25Dwe84g0 的精彩视频,您DO 需要小心避免在创建线程后分叉。我认为数字运算通常发生在 GIL 之外(C 库通常应该在处理时释放 GIL)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
相关资源
最近更新 更多