当前位置: 首页 > 面试题库 >

Python内置容器是线程安全的吗?

宗政学
2023-03-14
问题内容

我想知道Python内置容器(列表,向量,集合…)是否是线程安全的?还是我需要为共享变量实现锁定/解锁环境?


问题答案:

您需要为将在Python中修改的所有共享变量实现自己的锁定。你不必担心从不会被修改的变量读(即并发读取都OK了),所以稳定的类型(frozensettuplestr)都
可能是 安全的,但它不会伤害。对于你将要改变的东西-
listsetdict和大多数其他的对象,你应该有自己的锁定机制(而就地操作都OK在大多数的这些,线程可以导致超级讨厌的错误-
你还不如很好地实现锁定,这非常容易)。


顺便说一句,我不知道您是否知道,但是锁定在Python中非常容易-创建一个threading.lock对象,然后您可以像这样获取/释放它:

import threading
list1Lock = threading.Lock()

with list1Lock:
    # change or read from the list here
# continue doing other stuff (the lock is released when you leave the with block)

在Python 2.5中,执行from __future__ import with_statement; Python
2.4及更低版本没有此功能,因此您需要将acquire()/ release()调用放在try:...finally:块中:

import threading
list1Lock = threading.Lock()

try:
    list1Lock.acquire()
    # change or read from the list here
finally:
    list1Lock.release()
# continue doing other stuff (the lock is released when you leave the with block)

关于Python中线程同步的一些非常好的信息。



 类似资料:
  • 问题内容: 我注意到,通常建议使用具有多个线程的队列,而不是列表和。这是因为列表不是线程安全的,还是出于其他原因? 问题答案: 列表本身是线程安全的。在CPython中,GIL防止对它们的并发访问,而其他实现则请小心地为它们的列表实现使用细粒度锁或同步数据类型。但是,虽然列表本身不会因尝试并发访问而损坏,但列表的数据不受保护。例如: 如果另一个线程做同样的事情,则不能保证实际上将增加1,因为这不是

  • 问题内容: 有人说python字典是线程安全的。这是否意味着我可以或不能在字典中修改项目? 问题答案: 这两个概念完全不同。 线程安全性意味着两个线程无法同时修改同一对象,从而使系统处于不一致状态。 也就是说,在迭代字典时不能修改字典。请参阅文档。。 字典p在迭代过程中不应被突变。在字典上进行迭代时,修改键的值是安全的(自Python 2.1起),但前提是只要键的集合不变即可。

  • 问题内容: 我有一个多线程程序,在其中创建生成器函数,然后将其传递给新线程。我希望它本质上是共享/全局的,以便每个线程都可以从生成器获取下一个值。 使用这样的生成器是否安全?还是会遇到从多个线程访问共享生成器的问题/情况? 如果不是,是否有更好的方法来解决此问题?我需要可以在列表中循环并为任何线程调用它生成下一个值的东西。 问题答案: 它不是线程安全的;同时调用可能交错,并与局部变量混淆。 常用的

  • 我从这个问题中了解到,如果我想要一个线程安全的,我必须自己实现线程安全部分。 因此,我可以想出: 因此,在这个实现中,当然只有add()和remove()是线程安全的。其他方法不是,因为它们在子类中没有被覆盖。 现在,模式非常简单:获取锁,调用原始方法,释放锁。如果遵循上述逻辑,我必须以基本相同的方式覆盖公开的所有方法,例如: (伪代码) (/伪代码) 这不仅单调乏味,而且容易出错。那么,关于如何

  • 问题内容: 在中,此变量被声明为是我的问题,在某些调用之后检查值还是在多线程代码中使用perror()是安全的。这是线程安全变量吗?如果没有,那还有什么选择呢? 我在x86体系结构上将Linux与gcc一起使用。 问题答案: 是的,它是线程安全的。在Linux上,全局errno变量是特定于线程的。POSIX要求errno必须是线程安全的。 参见http://www.unix.org/whitepa

  • 问题内容: 我们在项目中使用了Drools kieSessions。许多线程可以创建新的kieSession。有时在创建会话时线程可能会挂起。因此,问题是: 首先 是kieContainer.newKieSession线程安全操作吗? 上吊的原因可能是肮脏的文字或阅读的kie会话集之类的东西吗? 问题答案: 当我在实践中检查 不是线程安全的操作。