【问题标题】:How to allow multiple threads to change different parts of an object using locks in Python?如何允许多个线程使用 Python 中的锁来更改对象的不同部分?
【发布时间】:2015-03-03 05:54:21
【问题描述】:

我希望通过只为这些元素而不是整个对象获取锁来允许不同的线程对 Value 的不同元素进行更改。

例如:考虑字典 -

D = {1:[time, speed, distance],2:[time1,speed1, distance1], 3:[time2, speed2, distance2]}

线程T1修改D[1][0],线程T2修改D[1][1],线程T3修改D[2][2]等,因此T1应该锁定D[1][0],T2应该锁定D[1][1]。 T3 应该锁定D[2][2] 并同时修改它们。

【问题讨论】:

  • dicts 的结构会改变,还是只改变值(列表)?
  • 只有列表。列表长度保持不变,但我想更新列表的元素。

标签: python multithreading locks


【解决方案1】:

在 Python 中,有Global Interpreter Lock,因此您不必担心锁定问题。您也不会获得多线程的性能优势,至少不会像您在 Java 或 C 中习惯的那样。

简而言之,一次只有一个线程会运行 Python 代码。如果您受 I/O 限制(例如网络访问),这就是您想要的解决方案。如果您受 CPU 限制(例如计算),请使用本机模块或查看多处理模块。

【讨论】:

  • 由于 GIL,不允许多个线程执行同一部分代码。我的问题是关于线程执行代码的不同部分但共享一个可变对象。还是我对 GIL 的理解有误?
  • GIL 确保 interpreter 运行序列化。至少在 CPython 中,解释器和进程是一样的。如果对象与本机代码共享,则必须先获取 GIL,然后再对其进行修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多