0

0

Python多线程内存共享方案 Python多线程共享内存的几种方式

看不見的法師

看不見的法師

发布时间:2025-11-13 12:41:29

|

971人浏览过

|

来源于php中文网

原创

python多线程内存共享方式包括:1. 全局变量配合lock确保线程安全,适用于简单数据共享;2. queue.queue实现线程安全通信,适合生产者-消费者模型;3. threading.local为线程提供独立数据副本,避免状态冲突;4. multiprocessing.shared_memory(python 3.8+)共享大块二进制数据如numpy数组,需手动同步。应根据场景选择合适机制并处理线程安全。

python多线程内存共享方案 python多线程共享内存的几种方式

Python多线程中,由于全局解释器锁(GIL)的存在,虽然多线程在CPU密集型任务中无法真正并行执行,但在IO密集型场景下仍具有实用价值。而在线程之间共享数据是常见需求。以下是几种常用的内存共享方式及其使用场景和注意事项。

1. 共享全局变量

最直接的共享方式是使用模块级的全局变量。所有线程都可以读写同一个变量,但由于Python对象的可变性不同,需注意线程安全。

说明: - 对于不可变类型(如int、str),直接赋值会创建新对象,其他线程不可见。 - 可变类型(如list、dict)可以在原地修改,多个线程看到的是同一对象。

建议:

  • 使用 threading.Lock 保护共享资源,避免竞态条件。
  • 示例:
    import threading
    </li></ul><p>data = []
    lock = threading.Lock()</p><p>def add_item(value):
    with lock:
    data.append(value)</p><p>t1 = threading.Thread(target=add_item, args=(1,))
    t2 = threading.Thread(target=add_item, args=(2,))
    t1.start(); t2.start()
    t1.join(); t2.join()

    2. 使用 queue.Queue 实现线程间通信

    queue.Queue 是线程安全的队列实现,适合生产者-消费者模型。

    立即学习Python免费学习笔记(深入)”;

    优点: - 内置锁机制,无需手动加锁。 - 支持阻塞操作(put/get 可设置超时)。 - 可控制缓冲区大小,防止内存溢出。

    使用示例:

    import queue
    import threading
    <p>q = queue.Queue(maxsize=5)</p><div class="aritcle_card flexRow">
                                                            <div class="artcardd flexRow">
                                                                    <a class="aritcle_card_img" href="/xiazai/shouce/1782" title="OpenMP多线程编程指南 WORD版"><img
                                                                                    src="https://img.php.cn/upload/manual/000/000/013/170692411925933.png" alt="OpenMP多线程编程指南 WORD版"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                    <div class="aritcle_card_info flexColumn">
                                                                            <a href="/xiazai/shouce/1782" title="OpenMP多线程编程指南 WORD版">OpenMP多线程编程指南 WORD版</a>
                                                                            <p>本文档主要讲述的是OpenMP多线程编程指南;OpenMP是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套指导性注释(Compiler Directive)。OpenMP是一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言,能被用于显示指导多线程、共享内存并行的应用程序编程接口。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看</p>
                                                                    </div>
                                                                    <a href="/xiazai/shouce/1782" title="OpenMP多线程编程指南 WORD版" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                            </div>
                                                    </div><p>def producer():
    for i in range(5):
    q.put(i)  # 自动阻塞当队列满
    print(f"Produced {i}")</p><p>def consumer():
    while True:
    item = q.get()
    if item is None:
    break
    print(f"Consumed {item}")
    q.task_done()

    3. 使用 threading.local 创建线程局部存储

    虽然这不是“共享”,但用于避免共享冲突的一种策略:为每个线程提供独立的数据副本。

    适用场景: - 需要每个线程有独立状态(如数据库连接、用户上下文)。 - 防止变量污染。

    示例:

    import threading
    <p>local_data = threading.local()</p><p>def process(name):
    local_data.name = name
    print(f"Hello {local_data.name}")</p><p>t1 = threading.Thread(target=process, args=("Alice",))
    t2 = threading.Thread(target=process, args=("Bob",))

    4. 使用 multiprocessing.shared_memory(限Python 3.8+)

    虽然名字叫 multiprocessing,但从Python 3.8起,shared_memory 模块也可被线程使用,尤其适合共享大块二进制数据(如NumPy数组)。

    特点: - 共享真实内存区域,节省复制开销。 - 需手动管理生命周期(创建/释放)。 - 线程间访问仍需同步机制

    示例(共享NumPy数组):

    from multiprocessing import shared_memory
    import numpy as np
    import threading
    <h1>创建共享内存</h1><p>a = np.array([1, 2, 3, 4])
    shm = shared_memory.SharedMemory(create=True, size=a.nbytes)
    buf = np.ndarray(a.shape, dtype=a.dtype, buffer=shm.buf)
    buf[:] = a[:]</p><p>def modify_array(offset):
    buf[offset] += 10</p><p>t1 = threading.Thread(target=modify_array, args=(0,))
    t2 = threading.Thread(target=modify_array, args=(1,))
    t1.start(); t2.start()
    t1.join(); t2.join()</p><p>print(buf)  # 查看结果
    shm.close()   # 使用完释放
    shm.unlink()  # 删除共享内存

    基本上就这些常见的Python多线程内存共享方案。根据实际需求选择:简单共享用全局变量加锁,通信用Queue,隔离状态用threading.local,大数据用shared_memory。关键是处理好线程安全问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

89

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

106

2025.09.18

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

970

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

605

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

212

2025.08.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

763

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

376

2025.12.24

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号