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

2024-06-19

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


您需要为将在 Python 中修改的所有共享变量实现自己的锁定。您不必担心从不会被修改的变量中读取(即并发读取是可以的),因此不可变类型(frozenset, tuple, str) are probably安全,但不会造成伤害。对于你将要改变的事情 -list, set, dict以及大多数其他对象,您应该拥有自己的锁定机制(虽然就地操作在大多数对象上都可以,但线程可能会导致超级讨厌的错误 - 您也可以实现锁定,这非常简单)。

顺便说一句,我不知道你是否知道这一点,但在 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: blocks:

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 中线程同步的一些非常好的信息 https://web.archive.org/web/20201101025814id_/http://effbot.org/zone/thread-synchronization.htm.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python内置容器是线程安全的吗? 的相关文章

随机推荐

  • 在哪里实现 Swift 协议?

    在 Swift 中实现协议一致性时 我有两个选择 具有相同的最终结果 在类中实现协议 也就是说 在类定义的顶部声明一致性 并将实现放在类体内 或者 在扩展中实现协议 也就是说 完全在类之外编写符合协议的代码 这是一个例子 public cl
  • 如何定义与更高类型类型(类型构造函数)绑定的上下文

    我尝试过以下方法 def test Option T Ordering value1 Option T value2 Option T val e implicitly Ordering Option T compare value1 va
  • 在 Delphi 中的 SOAP 标头中发送简单字符串

    我需要发送这样的东西
  • 为什么这个符号链接创建了两个实例

    我有一个用于我的点文件的安装脚本 我用来创建一个目录到我的主文件夹的符号链接 这些链接执行得很好 但创建了第二个符号链接 我无法解释为什么 项目中的文件夹结构如下所示 install sh scripts shell sh shell in
  • AWS ELB 和 GoDaddy 域正在运行

    我已在 goDaddy com 中注册了一个域 并希望将流量发送到 AWS Route53 我创建了一个 ELB 我执行了以下步骤 在 Route 53 中 为我的 godaddy 域名创建一个托管区域 这反过来又为我提供了一条包含 4 个
  • 找不到 OAuth2 参数

    我正在尝试使用 OAuth 2 0 来授权 google docs API 根据谷歌给出的例子https developers google com google apps documents list authorizing reques
  • Python Scrapy:“runspider”和“crawl”命令有什么区别?

    有人可以解释一下两者之间的区别吗运行蜘蛛 and crawl命令 应该在什么情况下使用它们 在命令中 scrapy crawl options
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • Matplotlib xlabel Arial 格式,其中一个单词为斜体

    我想创建一个 matplotlib 图形 其 x 轴标签采用 Arial 字体 并且有一个斜体字 我可以用乳胶字体创建带有 x 轴标签的图形 其中一个单词为斜体 我还可以在 Arial 中创建带有 x 轴标签的图形 只要我将整个标签设置为斜
  • pyplot 中的等宽绘图大小,同时保持纵横比相等

    我想让两个图具有相同的宽度 但是生成的代码缩小了 imshow 图 xx np linspace 0 0 255 5 512 yy np linspace 0 0 255 5 512 Func np random rand len xx l
  • CMake 链接 glfw3 lib 错误

    我正在使用 CLion 并且正在使用 glfw3 库编写一个程序 http www glfw org docs latest http www glfw org docs latest 我安装并正确执行了库中的所有操作 我有 a 和 h 文
  • 为什么我需要 Nginx 和 Puma?

    我正在将 Rails 应用程序部署到生产环境中 看起来 Puma 速度很快 可以处理我想要在网络服务器中完成的许多事情 我想知道我是否需要使用 Nginx 如果只使用 Puma 我会错过什么 Nginx 是一个 Web 服务器 puma 是
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • IntelliJ可以自动创建装饰器类吗?

    有时 我创建一个像这样的装饰器类 class MyInterfaceDecorator implements MyInterface private final MyInterface delegate constructor taking
  • 使用多线程使用rabbitmq消息队列(Python Kombu)

    我有一个带有单个队列的 RabbitMQ 交换 我希望创建一个运行多个线程并尽快通过该队列工作的守护进程 工作 涉及与外部服务的通信 因此每个消费者内部都会发生相当多的阻塞 因此 我希望有多个线程都处理来自同一队列的消息 我可以通过在主线程
  • Rails Active Storage - 保留现有文件/上传吗?

    我有一个 Rails 模型 has many attached files 默认情况下 通过 Active Storage 上传时 如果您上传新文件 它会删除所有现有上传内容并将其替换为新文件 我有一个控制器破解 由于多种原因 它不太理想
  • 图邻接表表示

    我正在尝试用 c 语言编写一个基本的图形程序 但是 会显示一条错误消息 指出The arrayOfVertices is undeclared 我正在使用邻接列表表示 代码是 include
  • 选中复选框时展开 Div

    我有一个复选框
  • getStyledAttributes 工作错误

    我正在尝试创建自己的键盘 使用 Android 键盘不足以完成我的任务 因此我决定直接从 View class 创建继承类 作为基础 我决定使用 Keyboard class 的代码 然后开始一一更改 我什至在尝试编译该类 使用一些反射和黑
  • Python内置容器是线程安全的吗?

    我想知道Python内置容器 列表 向量 集合 是否是线程安全的 或者我是否需要为我的共享变量实现锁定 解锁环境 您需要为将在 Python 中修改的所有共享变量实现自己的锁定 您不必担心从不会被修改的变量中读取 即并发读取是可以的 因此不