[Python] 多线程同步问题——信箱传递

Pytho异步多线程发送邮件 当批量发送邮件的时候,访问第三方邮件服务器等待返回的时间可能会比较长,而这时候同步执行代码就不适用了。这个时候就需要开启一个线程异步发送邮件: 视图函数代码: @web.route('/test/mail') def send_mail(): from app.libs.email import send_mail send_mail('1215798914@qq.com','d'... 阅读详情

题目

有n个线程,向同一个信箱(信箱的大小为k)里传递消息,放入的消息为数字i(i=1…n),有m个线程从信箱里取数字,取出来将数字*10并打印。

代码实现

"""
有n个线程,向同一个信箱(信箱的大小为k)里传递消息,放入的消息为数字i(i=1...n),有m个线程从信箱里取数字,取出来将数字*10并打印。
"""
import time
import random
from threading import Thread, Semaphore, Lock
list_len = 5
in_index, out_index = 0, 0
in_lock, out_lock, output_lock = Lock(), Lock(), Lock()
message_list = [0 for x in range(list_len)]
full_semaphore, empty_semaphore = Semaphore(0), Semaphore(list_len)

def producer(name, num: int):
    global in_index, in_lock, output_lock, list_len, message_list, full_semaphore, empty_semaphore
    print(name, id(message_list))
    while True:
        time.sleep(random.randint(1, 5))
        empty_semaphore.acquire()
        in_lock.acquire()
        message_list[in_index] = num
        in_index = (in_index + 1) % list_len
        in_lock.release()
        full_semaphore.release()
        output_lock.acquire()
        print(f'{name}已经加入一个: {num}')
        output_lock.release()

def consumer(name):
    global out_index, out_lock, output_lock, list_len, message_list, full_semaphore, empty_semaphore
    print(name, id(message_list))
    while True:
        time.sleep(random.randint(1, 5))
        full_semaphore.acquire()
        out_lock.acquire()
        num = message_list[out_index] * 10
        out_index = (out_index + 1) % list_len
        out_lock.release()
        empty_semaphore.release()
        output_lock.acquire()
        print(f'{name}已经取得一个: {num}')
        output_lock.release()

if __name__ == '__main__':
    p1, p2, p3 = Thread(target=producer, args=('Producer-1 ', 1, )), Thread(target=producer, args=('Producer-2 ', 2, )), \
                 Thread(target=producer, args=('Producer-3 ', 3,))
    c1, c2 = Thread(target=consumer, args=('Consumer-1 ', )), Thread(target=consumer, args=('Consumer-2 ', ))
    p1.start()
    p2.start()
    p3.start()
    c1.start()
    c2.start()

输出:

Producer-1  2432159404616
Producer-2  2432159404616
Producer-3  2432159404616
Consumer-1  2432159404616
Consumer-2  2432159404616
Producer-1 已经加入一个: 1
Producer-2 已经加入一个: 2
Consumer-1 已经取得一个: 10
Producer-3 已经加入一个: 3
Consumer-1 已经取得一个: 20
Consumer-2 已经取得一个: 30
Producer-1 已经加入一个: 1
Producer-2 已经加入一个: 2
Producer-1 已经加入一个: 1
Consumer-1 已经取得一个: 10
Consumer-2 已经取得一个: 20
Producer-3 已经加入一个: 3
Producer-2 已经加入一个: 2
Producer-2 已经加入一个: 2
Producer-1 已经加入一个: 1
Consumer-2 已经取得一个: 10
Producer-3 已经加入一个: 3
Consumer-1 已经取得一个: 30
Producer-3 已经加入一个: 3
Consumer-2 已经取得一个: 20
Producer-2 已经加入一个: 2
Consumer-1 已经取得一个: 20
Producer-3 已经加入一个: 3
Consumer-2 已经取得一个: 10
Producer-1 已经加入一个: 1
Consumer-1 已经取得一个: 30
Producer-3 已经加入一个: 3
Consumer-2 已经取得一个: 30
Producer-2 已经加入一个: 2
...
C++ 知识补充 向量(vector)是一个封装了动态大小数组的顺序容器(SequenceContainer)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。C++中map提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在map中出现一次;第二个称之为该关键字的对应值。 阅读详情

相关推荐

Python tkinter多进程多线程前邮箱,再用pyinstaller编译成exe

写博客记录一下Python 用tkinter 多进程线程写成的邮箱应用,只是一个简单的应用,尝试进程调度,并用pyinstaller打包成exe 注意: 1、平台环境win7  、Python3.6 、 pyinstaller3.3(安装方法,百度有,这里不加说明,Windows下Python3的pyinstaller会出错,解决办法,百度) 2、Windows下多进程,在if __name

qq_34896470的博客 2674

Python3 入门教程||Python3 SMTP发送邮件||Python3 多线程

在Python3 中应用的SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。python的 smtplib 提供了一种很方便的途径发送电子邮件。它对 smtp 协议进行了简单的封装。这里要注意一下第三个参数,msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意 msg 的格式。这个格式就是 smtp 协议中定义的格式。

爱编程的鱼的博客 2682

《广告核心指标驱动的AI投放系统:从数据洞察到智能决策的全链路优化》

本方案通过构建广告核心指标驱动的AI投放系统,实现从数据采集到智能决策的全链路自动化。

专注Java领域与微服务架构,热爱人工智能与深度学习 1066

Django中使用多线程发送邮件

1、settings.py 增加Email设置   #mail EMAIL_HOST = ‘smtp.gmail.com’                   #邮件smtp服务器 EMAIL_PORT = ’25′                                        #端口 EMAIL_HOST_USER = ‘code***@gmail.com’  #邮件账...

weixin_34418883的博客 225

步进电机

步进电机

happygrilclh的博客 2140

SRAM compiler选项中 Soft Error Repair (SER)

引起的瞬时故障,可能会影响 SRAM 中存储的数据。SER 功能通过某种机制检测并修复这些错误,从而提高存储器的可靠性。在 SRAM 编译器中,

hzmscut的博客 1152

python读取邮箱邮件_Python实现读取邮箱中的邮件功能示例【含文本及附件】

本文实例讲述了Python实现读取邮箱中的邮件功能。分享给大家供大家参考,具体如下:#-*- encoding: utf-8 -*-import sysimport localeimport poplibfrom email import parserimport emailimport string# 确定运行环境的encoding__g_codeset = sys.getdefaultenco...

weixin_36477752的博客 3511

Node.js内存溢出?一招搞定JavaScript heap out of memory错误(附永久配置方案)

本文深入解析Node.js内存溢出问题,提供从临时调整到永久配置的完整解决方案。重点介绍通过设置`max-old-space-size`参数和`NODE_OPTIONS`环境变量来扩展JavaScript堆内存限制,适用于Webpack、Vite等构建工具的大型项目场景,并涵盖Windows、Linux/macOS多平台配置方法。

cake8的博客 1053

线程间同步和通信,event semaphore mailbox

线程间同步和通信,event semaphore mailbox1. 概述2. 事件event3. wait_order()4. 旗语(semaphore)5. semaphore::get();6. semaphore::try_get()7. 信箱mailbox7.1. 信箱的内建方法7.2. mailbox::new()7.3. mailbox::num()7.4. 参数化信箱 1. 概述 测试平台中的所有线程都需要同步并交换数据 一个线程等待另外一个,例如验证环境需要等待所有激励结束、比较结束才可

Bunny9__的博客 1451

2026华为OD机试(C语言)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,C语言实现。

MISAYAONE的博客 11万+

YOLOv12中的A2C2f模块详解,涉及区域注意力模块(A2)和 R-ELAN 结构详解

区域注意力模块(Area Attention, A2)的设计出发点是为了解决传统注意力机制在计算复杂度和内存访问效率上的问题。传统的自注意力机制(Self-Attention)具有二次方的计算复杂度(O(n²)),尤其是在处理高分辨率图像时,计算成本非常高。此外,注意力机制的内存访问模式不如卷积神经网络高效,导致在实际应用中难以满足实时性要求。区域注意力模块通过将特征图划分为多个区域,并在每个区域内进行注意力计算,从而显著降低了计算复杂度。

Limiiiing的博客 5513

多智能体系统安全实践:共享内存蜜罐令牌的设计与实现

进程间通信(IPC)是分布式系统与多智能体协同的基础技术,其中共享内存以其零拷贝、低延迟的特性成为高性能场景的首选。其核心原理是通过映射同一块物理内存区域,实现进程间高效数据交换。然而,这种高效性也带来了安全风险:缺乏细粒度访问控制,使得共享内存成为数据泄露与恶意注入的潜在薄弱点。为应对此挑战,安全工程中常引入主动防御思想,例如蜜罐技术——通过部署诱饵资源来探测与响应异常。将蜜罐令牌(Honeytokens)这一微观诱饵植入共享内存关键区域,便构成了一个高效的内部威胁检测机制。当未授权进程或异常智能体访问这

weixin_34015336的博客 329

ssd训练自己的数据集

基于SSD实现目标检测(训练自己的数据集)

reset2021的博客 6803

嵌入式软件开发入门:从核心技能到实战路径全解析

嵌入式系统作为连接物理世界与数字世界的桥梁,其核心在于在资源受限的硬件环境中实现高效、可靠的控制与计算。其工作原理基于对底层硬件的直接操作,通过微控制器、实时操作系统等关键技术,实现对传感器、执行器等外设的精准管理。这一技术价值在于将计算能力嵌入到各类终端设备中,实现智能化与自动化,广泛应用于消费电子、汽车电子、工业控制及物联网等领域。在嵌入式软件开发中,掌握C语言、计算机体系结构及实时操作系统原理是基础,而通过项目实践,如基于STM32和FreeRTOS的智能家居网关开发,能深化对嵌入式系统分层架构的理解

weixin_30681121的博客 411

157、飞控中的鲁棒自适应控制

本文总结了飞控系统中鲁棒自适应控制的实践经验。作者通过炸机案例引出传统PID控制的局限性,分析了鲁棒性与自适应性的本质矛盾,提出"用鲁棒性兜底,用自适应性提性能"的设计原则。重点介绍了模型参考自适应控制(MRAC)的实现方法,包括参考模型设计、自适应律调参技巧(建议初始增益设为0.01)、直接/间接自适应的应用场景差异,以及防止参数漂移的鲁棒修正方法。文章还分享了实际调试中的三大关键问题(初始值设定、激励条件、执行器饱和)及解决方案,并推荐了"鲁棒PID+自适应前馈"的混合架构。最后强调调试顺序应为先保证鲁

2401_88858637的博客 27

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

使用两个信箱来实现线程的同步

对两个线程进行同步的另一种方式是再使用一个信箱把消费方的完成信息发回给生产方。如下面代码所示: program automatic mbx_mbx2 mailbox mbx, rtn; class Producer; task run(); int k; for(int i=1; i<4; i++)begin $display("Producer: before ...

强迫症高级患者的博客 444

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

线程的同步

很多情况之下,由信箱连接的两个线程运行时步调应该是一致的,这样生产方才不会跑到消费方的前面。这种方法的好处是,它能使生成激励的整个链条运行时步调一致。最高层的发生器需要等到底层的最后一个事务发出以后才能结束。 如果要想生产方和消费方两个线程步调是一致的,那就需要额外的握手信号。如下所示,生产方和消费方是两个类,使用信箱交换整数但两者之间没有明显的同步信号。生产方直到结束,消费方都还没有启动。 program automatic unsynchronized; mailbox mbx;

wutaotaotaotaoaa的博客 255

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

一篇文章梳理清楚 Python 多线程与多进程

在学习Python的过程中,有接触到多线程编程相关的知识点,先前一直都没有彻底的搞明白。今天准备花一些时间,把里面的细节尽可能的梳理清楚。 线程与进程的区别 进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。...

Python_xiaowu的博客 1647

Python 多线程实例

一、直接调用 #!/usr/bin/python # -*- coding : utf-8 -*- # 作者: Presley # 时间: 2018-11-19 # 邮箱:1209989516@qq.com # 这是我用来练习python多线程的测试脚本 import threading import time def sayhi(num): #定义每个线程要运行...

weixin_33884611的博客 173

【Python】存储字典的四种方法

Python存储字典的四种方法0.直接字典和被字符串包裹的字典1.eval + str2.json3.pickle4.numpy扩展:Python 三种方法字符串转字典 0.直接字典和被字符串包裹的字典 d = {'技术': {'后端开发': ['Java', 'C++', 'PHP'], '移动开发': ['HTML5', 'JavaScrpit']},'产品':{'产品经理': ['产品经理'...

Spade_的博客 4万+

python小应用之moviepy的视频剪辑制作gif图

对视频动画的编辑可以使用python的moviepy库,官方文档: http://zulko.github.io/moviepy/ 1、进入cmd,pip install moviepy 2、使用代码 #import imageio #imageio.plugins.ffmpeg.download() import moviepy.editor as mpy #视频文件的本地路径...

Spade_的博客 3万+

【Python】sorted对字典dict排序

sorted语法 sorted(iterable, key=None, reverse=False) 参数说明: iterable – 可迭代对象。 key --主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。 reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默...

Spade_的博客 2万+

[Python] Pandas读写Excel,读取单个、多个或全部表

Python 读写 Excel 可以使用 Pandas,处理很方便。但如果要处理 Excel 的格式,还是需要 openpyxl 模块,我个人不喜欢旧的 xlrd 和 xlwt 模块。步入正题。Pandas 读写 Excel 主要用到两个函数,下面分析一下 pandas.read_excel() 和 DataFrame.to_excel() 的参数,以便日后使用。 1. pandas.read_excel pandas.read_excel(io,sheet_name=0,header=0,names=No

Spade_的博客 2万+

【Python】三种方法字符串转字典

Python 三种方法字符串转字典 eval:不安全,容易被用户恶意操作 ast.literal_eval:安全,专门用于字符串类型转换其他类型 json:只能转换外单引号,内双引号的字符串 # -*- coding: utf-8 -*- import json, ast # TODO: 内单引号,外双引号 s = "{'技术': {'后端开发': ['Java', 'C++', 'PHP'...

Spade_的博客 2万+

【NumPy】sum(axis=0/1/2..)用图片解释

1. numpy.sum(axis=0/1/2)结果对比 import numpy # a.shape=(2,3,4) 2页3行4列 即:2个3行4列的二维矩阵 a = numpy.array([ [[1,2,3,4], [5,6,7,8], [9,10,11,12]], [[11,12,13,14], [15,16,17,18], ...

Spade_的博客 2万+

[Python] 一篇文章弄懂迭代器、生成器和yield

一篇文章弄懂yield、生成器1. 迭代器和生成器1.1 range迭代器和生成器1.2 迭代器1.3 生成器2. 使用yield的生成器函数3. 生成器的next()、send()、throw()、close()4 为什么说send()相当于next(),我们看看底层代码!5. 参考博客 1. 迭代器和生成器 迭代器: 可以迭代的对象 生成器: 按一定的算法生成一个序列,比如自然数序列、斐波那...

Spade_的博客 2万+
上一篇: [Python] 多进程和多线程在共享资源上的区别
下一篇: [Python] 传递参数前面的*或**
Spade_
博客等级 码龄10年 918粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值