Python进程之间同步实现代码

1、

# coding : UTF-8
import multiprocessing, time # 导入多进程的开发模块
def worker(dict): # 进程的处理函数
    while True: # 持续售票
        number = dict.get("ticket") # 获得当前的票数
        if number > 0 : # 如果现在还有剩余票
            number -= 1 # 让票数减少1
            print("【%s】ticket = %s" % (multiprocessing.current_process().name, number)) # 输出提示信息
            dict.update({"ticket": number}) # 更新票数
        else:# 已经没有票了
            break # 退出当前的售票循环
def main(): # 主函数
    manager = multiprocessing.Manager() # 创建共享数据对象
    # 此时创建了一个可以被多个进程之间共享的字典对象
    mgr_dict = manager.dict(ticket=5) # 默认提供有5张票
    # 如果要进行售票肯定要同时准备出多个进程于是下面创建10个售票进程列表
    job_process = [multiprocessing.Process(target=worker, args=(mgr_dict, ), name="售票员 - %s" % item) for item in range(10)]
    for process in job_process:
        process.start() # 启动售票进程
    for process in job_process:
        process.join() # 强制进程运行完毕
    print("【%s】所有进程只想你个完毕,最终剩余票数:%s" % (multiprocessing.current_process().name, mgr_dict.get("ticket")))
if __name__ == "__main__": # 判断程序执行名称
    main() # 调用主函数

2、
# coding : UTF-8
import multiprocessing, time # 导入多进程的开发模块
def worker(dict): # 进程的处理函数
    while True: # 持续售票
        number = dict.get("ticket") # 获得当前的票数
        if number > 0 : # 如果现在还有剩余票
            time.sleep(1) # 判断和售票之间追加延迟
            number -= 1 # 让票数减少1
            print("【%s】ticket = %s" % (multiprocessing.current_process().name, number)) # 输出提示信息
            dict.update({"ticket": number}) # 更新票数
        else:# 已经没有票了
            break # 退出当前的售票循环
def main(): # 主函数
    manager = multiprocessing.Manager() # 创建共享数据对象
    # 此时创建了一个可以被多个进程之间共享的字典对象
    mgr_dict = manager.dict(ticket=5) # 默认提供有5张票
    # 如果要进行售票肯定要同时准备出多个进程于是下面创建10个售票进程列表
    job_process = [multiprocessing.Process(target=worker, args=(mgr_dict, ), name="售票员 - %s" % item) for item in range(10)]
    for process in job_process:
        process.start() # 启动售票进程
    for process in job_process:
        process.join() # 强制进程运行完毕
    print("【%s】所有进程执行完毕,最终剩余票数:%s" % (multiprocessing.current_process().name, mgr_dict.get("ticket")))
if __name__ == "__main__": # 判断程序执行名称
    main() # 调用主函数

3、
# coding : UTF-8
import multiprocessing, time # 导入多进程的开发模块
def worker(lock, dict): # 进程的处理函数
    while True: # 持续售票
        lock.acquire(timeout=5) # 请求锁定,如果5秒没有锁定则放弃锁定
        number = dict.get("ticket") # 获得当前的票数
        if number > 0 : # 如果现在还有剩余票
            number -= 1 # 让票数减少1
            print("【%s】ticket = %s" % (multiprocessing.current_process().name, number)) # 输出提示信息
            time.sleep(1)  # 判断和售票之间追加延迟
            dict.update({"ticket": number}) # 更新票数
        else:# 已经没有票了
            break # 退出当前的售票循环
        lock.release() # 释放锁
def main(): # 主函数
    lock = multiprocessing.Lock() # 定义了一个进程的同步锁
    manager = multiprocessing.Manager() # 创建共享数据对象
    # 此时创建了一个可以被多个进程之间共享的字典对象
    mgr_dict = manager.dict(ticket=5) # 默认提供有5张票
    # 如果要进行售票肯定要同时准备出多个进程于是下面创建10个售票进程列表
    job_process = [multiprocessing.Process(target=worker, args=(lock, mgr_dict, ), name="售票员 - %s" % item) for item in range(10)]
    for process in job_process:
        process.start() # 启动售票进程
    for process in job_process:
        process.join() # 强制进程运行完毕
    print("【%s】所有进程执行完毕,最终剩余票数:%s" % (multiprocessing.current_process().name, mgr_dict.get("ticket")))
if __name__ == "__main__": # 判断程序执行名称
    main() # 调用主函数

4、
# coding : UTF-8
import multiprocessing, time # 导入多进程的开发模块
def worker(sema): # 进程的处理函数
    if sema.acquire(): # 获取信号量,如果没有可用信号量则进入到阻塞等待
        print("【%s】进程开始进行业务办理" % (multiprocessing.current_process().name)) # 输出提示信息
        time.sleep(2)  # 模拟一下业务办理时间
        sema.release() # 释放资源
def main(): # 主函数
    sema = multiprocessing.Semaphore(3) # 只允许有三个进程并发执行
    # 如果要进行售票肯定要同时准备出多个进程于是下面创建10个售票进程列表
    job_process = [multiprocessing.Process(target=worker, args=(sema, ), name="业务客户 - %s" % item) for item in range(10)]
    for process in job_process:
        process.start() # 启动售票进程
    for process in job_process:
        process.join() # 强制进程运行完毕
if __name__ == "__main__": # 判断程序执行名称
    main() # 调用主函数

5、

# coding : UTF-8
import multiprocessing, time # 导入多进程的开发模块
def restaurant_handle(event): # 餐厅的处理进程
    print("1、【餐厅】为食客安排座位,并在一旁等待食客点餐...")
    time.sleep(1) # 模拟一个食客点餐的时间损耗
    event.set() # 解除阻塞状态
    event.clear() # 清除已有的状态
    event.wait() # 等待食客后续处理
    print("3、【餐厅】厨师接到菜单,开始烹饪美食...")
    event.set() # 解除食客等待
    event.clear() # 清除已有的状态
def diners_handle(event): # 食客处理进程
    event.wait() # 等待之前的第1步完成,进入到阻塞状态
    print("2、【食客】食客看完菜单,选好了自己心仪的美食...")
    time.sleep(1) # 餐厅要进行下单处理,随后要进行烹饪的时间损耗
    event.set() # 解除阻塞状态
    event.clear() # 之前的状态清空
    event.wait() # 继续等待后续的处理步骤
    print("4、【食客】享用丰盛美食...")
def main(): # 主函数
    event = multiprocessing.Event() # 定义一个Event同步处理
    restaurant_process = multiprocessing.Process(target=restaurant_handle, args=(event,), name="餐厅服务进程")
    diner_process = multiprocessing.Process(target=diners_handle, args=(event,), name="食客进程")
    restaurant_process.start()
    diner_process.start()
if __name__ == "__main__": # 判断程序执行名称
    main() # 调用主函数

6、
# coding : UTF-8
import multiprocessing, time # 导入多进程的开发模块
def barrier_handle(): # 栅栏处理函数
    print("当前战斗小组整装完毕,出发执行任务...")
def arrangement(barrier):
    print("【%s】开始收拾行军准备..." % multiprocessing.current_process().name)
    time.sleep(2) # 每一位队员需要2秒的时间进行打包
    barrier.wait() # 进入到一个屏障点等待
    print("【%s】装备整理完毕和同组人员出发..." % multiprocessing.current_process().name)
def main(): # 主函数
    barrier = multiprocessing.Barrier(parties=3 , action=barrier_handle) # 每达到3个进程则调用处理函数
    process_list = [multiprocessing.Process(target=arrangement, args=(barrier, ), name="士兵 - %s" % item) for item in range(12)]
    for process in process_list:
        process.start()
    for process in process_list:
        process.join()
    barrier.abort() # 结束同步栅栏的锁定
if __name__ == "__main__": # 判断程序执行名称
    main() # 调用主函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/177965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维 | 四层和七层负载均衡介绍

关注: CodingTechWork 负载均衡 负载均衡介绍 概念 负载均衡是建立在现有的网络结构之上,提供一种廉价且透明的方式进行网络设备和服务器带宽的扩展,从而增加吞吐量,加强应用服务的数据处理能力,有效提高网络的灵活性和可用性。…

深度视觉目标跟踪进展综述

1 引言 目标跟踪旨在基于初始帧中指定的感兴趣目标( 一般用矩形框表示) ,在后续帧中对该目标进行持续的定位。 基于深度学习的跟踪算法,采用的框架包括相关滤波器、分类式网络、双路网络等。 处理跟踪任务的角度,分为基于匹配思路的双路网…

操作系统——操作系统概论s

一、操作系统基本概念 1 操作系统定义 操作系统是裸机上的第一层软件,它是对硬件系统功能的首次扩充, 用以填补人与机器之间的鸿沟。 OS定义:操作系统是控制和管理计算机系统内各种硬件和软件资源,有效地组织多道程序运行的系统软…

makefile中常见的环境变量

makefile中常见的环境变量 1)CFLAGS:用于指定C语言编译器的选项,例如优化级别、警告级别、编译器标志等。 2)CXXFLAGS:用于指定C语言编译器的选项,与CFLAGS类似,但专门针对C代码。 3&#xff0…

W2311283-可燃气体监测仪怎么监测燃气管道

可燃气体监测仪怎么有效监测燃气管道 燃气管道遍布于城市地下各处,作为城市生命线的一部分,一旦燃气管网出现泄露问题便是牵一发而动全身,城市的整体安全也会受到威胁。但是如何才能科学管理和监测燃气管网呢? 燃气管网监测系统便…

米贸搜|如何设置 Facebook 转换 API + 事件重复数据删除

Facebook Pixel 可让您跟踪用户在您网站上的行为、收集再营销受众并创建相似对象。如果 Facebook 像素实现正确,它将向 FB 机器学习算法提供相关信息。 FB ML 将使用像素数据向最有可能转化的人展示您的广告。 几年来,我们可以通过 JavaScript 代码、应…

MapReduce概念

1、概念 MapReduce 是一种编程模型,用于大规模数据集的并行处理。它是由 Google 开发的,用于处理大规模数据集的分布式计算框架。 MapReduce 的主要作用是将一个大的任务分解成多个小的任务,并在多台机器上并行执行这些任务。它包括两…

「我在淘天做技术」迈步从头越 - 阿里妈妈广告智能决策技术的演进之路

作者:妙临、霁光、玺羽 一、前言 在线广告对于大多数同学来说是一个既熟悉又陌生的技术领域。「搜广推」、「搜推广」等各种组合耳熟能详,但广告和搜索推荐有本质区别:广告解决的是“媒体-广告平台-广告主”等多方优化问题,其中媒…

localForage存储

一、什么是 localForage 当我们的存储量比较大的时候,我们一定会想到我们的 indexedDB,让我们在浏览器中也可以 使用数据库这种形式来玩转本地化存储,然而 indexedDB 的使用是比较繁琐而复杂的, 有一定的学习成本,但 …

STM32串口波特率在使用中的改变方法

上次讲到了STM32串口波特率在使用中的改变: void MX_USART_UART_Init(UART_HandleTypeDef *huart, USART_TypeDef * uart, int BaudRate) {huart->Instance uart;huart->Init.BaudRate BaudRate;huart->Init.WordLength UART_WORDLENGTH_8B;huart->…

力扣二叉树--第三十三天

前言 前面都是遍历,今天是构造二叉树。 前序和中序可以唯一确定一棵二叉树。 后序和中序可以唯一确定一棵二叉树。 前序和后序不能唯一确定一棵二叉树! 内容 一、从中序与后序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树 给定两个整…

视频文案怎么写,媒介盒子支招

近几年短视频成为风口,各行各业都想分一杯羹,但是一头热的你,是否知道短视频的相关文案怎么写呢?正所谓兵马未动,文案先行,一个合适的文案是上热门的秘密武器,今天媒介盒子就来和大家聊聊:视频…

Doris-Routine Load(二十七)

例行导入(Routine Load)功能为用户提供了一种自动从指定数据源进行数据导入的功能。 适用场景 当前仅支持从 Kafka 系统进行例行导入,使用限制: (1)支持无认证的 Kafka 访问,以及通过 SSL 方…

jks、cer、p12生成

//jks生成 keytool -genkeypair -alias "tomcat" -validity 3650 -keyalg "RSA" -keystore "test.jks" //cer生成 keytool -export -alias "tomcat" -keystore "test.jks" -storepass 123456 -file test.cer //p12生成 …

Attempted to serialize java.lang.Class. Forgot to register a type adapter?

问题:Attempted to serialize java.lang.Class. Forgot to register a type adapter? 原因:Gson不支持类信息,序列化和返序列化 解决方案: 使用Gson的 excluedFieldsWithoutExposeAnnotation() 选项忽略这些字段 Gson gson new …

VMware系列:VMware官网注册账号之验证码问题以及获取ESXi安装程序的方法

VMware官网注册账号之验证码问题以及获取ESXi安装程序的方法 一. VMware官网注册账号之验证码问题1. VMware官网基础账号注册2. VMware官网exsi试用注册二. 获取ESXi安装程序的方法原生态版本下载过程OEM版本下载VMware官网下载过程服务器厂家官网下载过程附录:一. VMware官网…

ArkTS框架深度解析:@Prop、@Link、@ObjectLink装饰器的应用与同步机制【鸿蒙专栏-09】

文章目录 ArkTS框架深度解析:@Prop、@Link、@ObjectLink装饰器的应用与同步机制【HarmonyOS开发】@Prop装饰器概述限制条件使用规则说明使用场景@Link装饰器概述限制条件使用规则说明使用场景@Link装饰器的高级用法动态创建链接自定义同步逻辑最佳实践和注意事项结语ArkTS框架…

小新 Air-14 2021 Intel处理器ITL版(82FF)原厂Win11系统

链接:https://pan.baidu.com/s/1EkqpdGcixCNER5uP5yIc4Q?pwddm1d 提取码:dm1d lenovo联想小新Air14笔记本2021款【82FF】原装出厂Windows11系统镜像ISO文件 系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等…

手机如何去图片水印?试试这三种方法

手机如何去图片水印?去水印已然成为了自媒体从业者必备技能之一,无论是工作或生活中经常遇到图片/视频上带有水印,非常影响整体观感,网上去水印方法又很多,如果你是小白,这篇文章将提供给你三个实用去水印的…

草图大师sketchup道路怎么快速种树?

草图大师sketchup道路怎么快速种树?草图大师中的道路图纸想要在道路两旁种树,该怎么快速给道路种树呢?下面我们就来看看详细的教程,需要的朋友可以参考下 草图大师sketchup中想要快速种树,该怎么种多棵树呢&#xff1…