【18.6 python中的线程通信】

Python线程间通信方式 1、python多线程 #! /usr/bin/evn python3 # --*-- coding: utf-8 --*-- #该实例反编译来说明函数执行流程 import dis def add(a): a = a+1 return a print(dis.dis(add)) # Python中一个线程对应于C语言中的一个线程(CPython而言)(Python并不一定... 阅读详情

python中的线程通信


在Python中,线程通信是多个线程之间交换信息或数据的过程。由于线程共享进程的内存空间,因此它们可以直接访问和修改同一份数据。然而,这种共享访问也带来了数据竞争和同步问题。为了确保线程之间的正确通信和数据一致性,Python提供了多种线程通信机制。

1. 共享全局变量

最简单直接的方式是通过共享全局变量来进行线程间通信。然而,这种方式需要仔细管理同步问题,以避免数据竞争和条件竞争。

import threading

# 全局变量
shared_data = 0

def worker():
    global shared_data
    shared_data += 1

# 创建并启动线程
t1 = threading.Thread(target=worker)
t2 = threading.Thread(target=worker)

t1.start()
t2.start()

# 等待线程完成
t1.join()
t2.join()

print(shared_data)  # 可能的结果不是2,因为存在数据竞争

2. 使用锁(Locks)

锁是线程同步的基本机制之一,它可以防止多个线程同时访问共享资源。在Python中,threading模块提供了Lock类来实现锁。

import threading

shared_data = 0
lock = threading.Lock()

def worker():
    global shared_data
    with lock:  # 使用with语句自动管理锁的获取和释放
        shared_data += 1

# 创建并启动线程
t1 = threading.Thread(target=worker)
t2 = threading.Thread(target=worker)

t1.start()
t2.start()

t1.join()
t2.join()

print(shared_data)  # 正确输出2

3. 事件(Events)

Event是线程间通信的另一种方式,它允许一个线程等待另一个线程的通知。Event对象管理一个内部标志,该标志可以被设置为True或False。线程可以等待这个标志变为True,或者设置这个标志为True以通知等待的线程。

import threading

def worker(event):
    print('Worker waiting for event')
    event.wait()  # 等待事件被设置
    print('Worker got event')

event = threading.Event()

t = threading.Thread(target=worker, args=(event,))
t.start()

# 做一些工作...

# 通知线程
event.set()

4. 条件变量(Condition)

条件变量比锁更高级,它允许线程在等待某个条件成立时挂起。当条件变量上的某个条件满足时,一个或多个等待的线程将被唤醒以继续执行。

import threading

def worker(cond, item):
    with cond:
        print(f'Worker {item} is waiting')
        cond.wait()  # 等待条件变量上的某个条件满足
        print(f'Worker {item} was notified')

cond = threading.Condition()

t1 = threading.Thread(target=worker, args=(cond, 'A'))
t2 = threading.Thread(target=worker, args=(cond, 'B'))

t1.start()
t2.start()

# 做一些工作...

with cond:
    # 通知所有等待的线程
    cond.notify_all()

5. 队列(Queues)

队列是线程安全的,它们被设计用来在多线程程序中安全地交换数据。queue模块提供了多种队列实现,包括线程安全的队列。

import queue
import threading

def worker(q):
    while True:
        item = q.get()  # 从队列中获取项目
        if item is None:
            break
        print(f'Processing {item}')
        q.task_done()  # 表示前一个项目已处理完毕

q = queue.Queue()

t = threading.Thread(target=worker, args=(q,))
t.start()

# 发送数据到线程
q.put('some work')
q.put(None)  # 发送结束信号

t.join()

以上是Python中线程通信的一些主要机制。选择哪种机制取决于你的具体需求和场景。

【专题】一文让你彻底明白python中的进程、线程、协程、GIL 文章内容可能会比较长,针对每一部分的内容,建议深入了解,我之所以把这些知识点放在一起解析,\color{red}{文章内容可能会比较长,针对每一部分的内容,建议深入了解,我之所以把这些知识点放在一起解析,}文章内容可能会比较长,针对每一部分的内容,建议深入了解,我之所以把这些知识点放在一起解析, 一是想比较清晰的整理出来,遇到问题不用到处找,二是坚持学完python中的这一部分知识,不要只是一知半解。\color{purple}{ 一是想比较清晰的整理出来,遇到问题不用到处找,二是坚持学完python中的这 阅读详情

相关推荐

Python - 进程、线程、协程

多进程 基本调用 进程池 Pool 进程间通信 Queue 分布式进程 多线程 基本调用 继承 threading.Thread 类 主线程 & 父/子线程 属性等,线程状态 线程锁 lock 多核CPU & GIL锁 协程 简单使用 使用 greenlet 使用 gevent async, await...

AI工程化、开源分享、文档翻译、代码笔记 659

Python中线程间通信

快来和我一起学习Python中线程间通信(一起努力,咱们顶峰相见!!!)

精益求精,永无止境,永远在路上! 6781

python 1200例——【18】python中的Quene使用方法,包含多线程和多进程

在Python中,队列(Queue)是一种抽象的数据类型,它遵循先进先出(FIFO)的原则。队列是一种特殊的线性表,只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。Python标准库中的queueQueue:这是一个简单的队列类,可以用来实现先进先出的数据结构。LifoQueue:这是一个后进先出(LIFO)的数据结构,与栈类似。:这是一个优先级队列,可以根据元素的优先级进行排序。下面是一个使用# 创建一个队列# 向队列中添加元素q.put(i)

m0_47867638的博客 1076

python中的线程间通信

前面学习了线程的一些基本知识如与进程的区别,线程的组成,线程如何创建等,接下来继续线程的学习。

瑞瑞的博客 3976

18.7:Python的Socket编程中如何进行多线程编程?

Python的Socket多线程编程技术是一项非常重要的技术,对于Python程序的并发性能和响应速度具有重要的影响。在学习这些技术时,我们需要注意一些细节问题,以充分利用Python的Socket多线程编程技术,提高程序的性能和效率。同时,我们也需要注意Python的Socket编程中的一些细节问题,以保证程序的正确性和可靠性。希望本文能够对读者深入了解Python的Socket多线程编程技术有所帮助。

小兔子平安 243

SQL实现数据仓库ETL:分层设计、增量抽取与性能优化实践

在数据仓库建设过程中,ETL(抽取、转换、加载)是数据流转的核心环节。传统观点常将ETL与专业工具或大数据框架绑定,但在中小规模数据场景下,基于SQL的ETL方案凭借低门槛、高可维护性和直观的排错体验,成为高效且务实的选择。本文从ETL的基础概念出发,阐述数据仓库分层(ODS、DWD、DWS、ADS)中每层ETL的定位与职责,重点剖析增量抽取策略(时间戳、主键、日志)下的SQL实现方式,以及数据清洗、去重和格式化的常见写法。同时,结合真实项目经验,分享慢SQL优化技巧、任务调度依赖设计、幂等性保障和常见问题

weixin_33290540的博客 346

Python线程通讯

本文详细解释了Python中线程通讯的概念、方法以及最佳实践。通过介绍全局变量、锁、条件变量、队列、信号量、事件和管道等机制,我们了解了如何在Python中实现线程间的通讯和同步。同时,我们也强调了避免过度使用全局变量、优先使用队列进行线程间数据传递、合理使用锁和条件变量以及注意线程安全等最佳实践。希望这些内容能帮助你更好地理解和应用Python中的线程通讯技术。

Python老吕的博客 1453

ANSYS Fluent DPM实战:从单点到锥形注入的粒子模拟全流程解析

本文深度解析了ANSYS Fluent中离散相模型(DPM)的粒子注入(Injection)设置全流程。从单点注入到锥形喷雾,详细阐述了不同注入类型的物理本质、参数逻辑与适用场景,并提供了粒径分布、湍流扩散等高级参数设置技巧与实战避坑指南,帮助工程师精准模拟喷雾、粉尘等粒子运动行为。

weixin_29276847的博客 654

多线程 vs 异步 vs 多进程爬虫性能对比

本文对比了Python爬虫开发中三种并发方案:多线程、异步(协程)和多进程。多线程适合I/O密集型任务但受GIL限制;异步协程资源占用低、并发量高,但需重写异步代码;多进程适合CPU密集型任务但开销大。实测显示纯网络爬取性能:异步>多线程>多进程。建议根据需求选择:小型爬虫用多线程,高并发用异步,密集计算用多进程或混合架构。最佳实践是组合使用不同方案,如异步爬取+多进程解析。

weixin_41943766的博客 1114

碳酸钙岩石酸蚀酸溶COMSOL建模:非均质对酸蚀通道的影响

多孔介质中的流动与化学反应耦合是石油工程和地下资源开发中的核心问题,酸液与岩石矿物的溶蚀过程直接关系到酸化增产效果。在碳酸盐岩储层中,盐酸与方解石的反应速率极快,酸液会优先沿高渗透区域推进,形成指状酸蚀通道,即wormhole。传统均质模型难以描述这种局部溶蚀行为,而数值模拟工具COMSOL通过耦合达西定律、稀物质传递与孔隙度演化方程,能够定量刻画酸蚀路径与渗透率的变化规律。工程实践中,模拟结果可用于预测酸液突破体积、优化注入排量,并为基质酸化方案设计提供依据。本文围绕碳酸钙岩石酸蚀酸溶COMSOL模型,探

weixin_29009401的博客 328

WorkBuddy KiCad 实战:国产 AI 搭子不只会写代码,传感器板从零走到可审查

真正可用的 PCB 教程不能承诺“一键打样”。本课把 WorkBuddy 放在需求拆分、文件生成和审查记录的位置,KiCad 负责 ERC、DRC 与制造文件,工程师负责最终判断。 本课不会用“AI 一键完成”制造错觉,而是把 WorkBuddy、KiCad 8.0、Python 3.11 与人工审阅组成一条可复现链路。你会从“已确认的接口表、器件库来源、板框与电源方案”出发,得到“KiCad 工程、原理图、初始 BOM、ERC 报告与审查记录”,并学会用真实命令、错误信号和停止条件判断成果能不能进入下一阶

yueyeguzhuo的专栏 216

Qwen3-ASR-0.6B与Qt集成:跨平台语音应用开发

本文介绍了如何在星图GPU平台上自动化部署Qwen3-ASR-0.6B镜像,快速构建跨平台语音识别应用。该镜像支持52种语言及22种中文方言,适用于教育课堂实时转录、政务粤语识别、无障碍语音辅助等典型场景,显著提升语音到文本的端到端处理效率。

weixin_30995917的博客 46

黑猫带你学UFS协议第1篇:全网最全UFS协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)

本文由黑猫学长撰写,深入解析UFS协议,覆盖从基础概念到高级特性的全方位教程。适合存储芯片行业从业者和嵌入式开发者,旨在帮助读者快速掌握UFS协议,适用于高端智能手机、平板等智能设备。预计15万字,涵盖UFS 3.1协议,讲解UFS协议栈、物理层、链路层、传输层等内容。

黑猫奥利奥的博客 3696

Python 魔法学院 - 第18篇:Python 多线程 ⭐⭐⭐

Python 多线程编程是提升程序效率的关键技术。本文深入探讨了多线程的基础概念、线程创建与启动、线程同步机制(如 Lock 和 Condition)、线程间通信(如 Queue)以及线程池的使用。通过生动的比喻和实际代码示例,帮助读者理解多线程的工作原理和常见陷阱,如 GIL、死锁和线程安全问题。

星核日记,一个编程开发者的小天地。我将和大家一起,穿梭于多语言迷宫,剖析算法精妙,分享实战项目。 1272

pytorch实现基本的logistic和softmax回归实验(手动+torch)

前提:不是前馈神经网络,没有隐藏层。 一:Logistic回归实验–人工构造数据集,手动构造模型 要求: 动手从0实现logistic回归,实现二分类,人工构造数据集,并分析loss、训练集、测试集的准确率。(要求从零实现二元交叉熵) 实验过程: 1.1人工构造数据集 1. # #自定义数据---训练集 2. num_inputs = 2 3. n_data = torch.ones(1500, num_inputs) # 数据的基本形态 4. x1 = torch.normal(2 * n_d

qq_37534947的博客 1万+

2025.06.16【转录组】|Ribo-seq数据流程详解(二 基因组比对)

本文详细介绍了Ribo-seq数据分析中的比对流程,包括环境准备、STAR索引构建、比对参数设置及结果统计可视化。通过samtools和R脚本实现比对质量评估,提供常见问题解决方案和关键指标解读。该流程强调比对参数优化和质量控制,为后续翻译组学分析奠定基础。

1979

【18.3 python中的进程通信】

python中的进程通信

MITA1的博客 651

【C语言】字符常量详解

字符常量是C语言中处理字符数据的重要工具。通过单引号括起一个字符,我们可以方便地使用字符常量进行字符判断、字符运算和字符串处理等操作。理解字符常量的表示方法、使用场景和ASCII码对应关系,对于编写高效的C语言程序至关重要。

LuckiBit 5017

Python 并发简介(多线程、多进程)

b站学习视频笔记

qingguideng的博客 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

专题13 一文让你彻底明白python中的进程、线程、协程、GIL

进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合 和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。

m0_60707660的博客 858

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python线程唤醒_Python 并发编程(一)之线程

常用用法t.is_alive()Python中线程会在一个单独的系统级别线程中执行(比如一个POSIX线程或者一个Windows线程)这些线程将由操作系统来全权管理。线程一旦启动,将独立执行直到目标函数返回。可以通过查询一个线程对象的状态,看它是否还在执行t.is_alive()t.join()可以把一个线程加入到当前线程,并等待它终止Python 解释器在所有线程都终止后才继续执行代码剩余的部分...

weixin_31908803的博客 920

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

python多线程

python多线程知识大全

hutaotaotao的博客 2597

python如何让进程运行在指定的cpu上_python之线程和进程(9.18)

这几天由于遇到了python中的多线程和多进程的问题,所以查了查资料,随便尝试了一下。首要问题就是,什么是线程,而什么又是进程?在此贴出一位大佬的知乎答案,我觉得说的很好,就不再重复说了,答案在这,https://www.zhihu.com/search?type=content&q=%E7%BA%BF%E7%A8%8B%E4%B8%8E%E8%BF%9B%E7%A8%8B总结而言,就是两...

weixin_39674028的博客 788

Python知识点18---进程和线程

首先我要给大家说一下进程和线程有什么区别,进程包含着线程,我们都打开过Windows的任务管理器,我们在其中看到的各种任务,每一个任务,就是一个进程,在这个进程下,有着多个线程组成了这个进程,我在网上找了一个更贴切的解释 Python允许你的任务是多进程执行的,在使用多进程的时候你需要注意两点 1、进程之间不共享资源,因为他们相互之间是独立的 2、主进程的结束,要等到所有子进程全部结束,这一点大家或许有疑惑,其实我们在运行一个程序时,一开始直接运行的进程就是主进程,也就是说主进程有且只有一个,而子进程就

别人笑我太疯癫,我笑他人看不穿。 1159

Python线程指南

详细讲解 Python线程指南

m0_59485658的博客 241

Python 中的多进程、多线程编程(关键词:Python/进程/线程/多进程/多线程)

进程 进程是什么? 进程:执行中的程序。 进程控制块(Process Control Block) 线程 线程是什么? 线程控制块(Thread Control Block) 进程与线程的区别? 线程与属于同一进程的其他线程共享代码段、公共数据段、打开文件和信号等等。 (《操作系统概念(第 7 版)》 - P111) 多进程与多线程的区别? 区别 1:和线程不同,进程没有任何共享状态;如果某个进...

Henry1991back的博客 757
上一篇: 【18.3 python中的进程通信】
下一篇: 【18.5 python中创建线程】
wang151038606
博客等级 码龄14年 995粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wang151038606

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值