Python中使用multiprocessing模块创建进程

        在计算机编程领域,多进程编程是一种常见的并发编程技术,特别适用于利用多核处理器来提高程序性能和并行处理任务。Python作为一种功能强大的编程语言,提供了多种方法来实现多进程编程。其中,multiprocessing模块为我们提供了一种简单而强大的方式来创建和管理进程。本文将深入介绍Python中使用multiprocessing模块创建进程的方法和技巧。

一、multiprocessing模块简介
        multiprocessing模块是Python标准库中的一个内置模块,主要用于实现多进程编程。它提供了创建进程、子进程管理、进程间通信等功能,使得我们可以轻松地编写并发程序。与Python的threading模块相比,multiprocessing模块更适合执行CPU密集型任务,因为它使用多个进程而不是多个线程,并充分利用了多核处理器的优势。

二、创建进程的方法
        使用multiprocessing模块创建进程非常简单。下面是一个基本的示例:

import multiprocessingdef worker():print("子进程执行")if __name__ == '__main__':p = multiprocessing.Process(target=worker)p.start()p.join()print("主进程执行")

        在上述示例中,我们首先导入了multiprocessing模块,然后定义了一个名为worker的函数,用于在子进程中执行的任务。在`if __name__ == '__main__':`的条件下,我们创建了一个进程`p`,并将目标函数设为`worker`。最后,我们使用`p.start()`启动子进程,使用`p.join()`等待子进程执行完毕,然后打印出"主进程执行"。运行该程序,你将看到子进程和主进程交替执行的结果。

三、进程间通信
        在实际并发编程中,进程之间的通信是非常重要的。multiprocessing模块提供了多种方法来实现进程间的通信,包括队列、管道、共享内存等。

1. 队列
        队列是一种常见的进程间通信方式,它可以安全地传递数据,使得多个进程之间可以方便地共享信息。以下是使用队列实现进程间通信的示例:

import multiprocessingdef producer(queue):for i in range(5):queue.put(i)print("生产者生产:", i)def consumer(queue):while True:item = queue.get()if item is None:breakprint("消费者消费:", item)if __name__ == '__main__':queue = multiprocessing.Queue()p = multiprocessing.Process(target=producer, args=(queue,))c = multiprocessing.Process(target=consumer, args=(queue,))p.start()c.start()p.join()c.join()

        在上述示例中,我们首先创建了一个队列`queue`,然后定义了一个生产者函数`producer`,用于向队列中放入数据。接着,我们定义了一个消费者函数`consumer`,用于从队列中取出数据并进行处理。在主程序中,我们创建了一个生产者进程`p`和一个消费者进程`c`,并将队列`queue`作为参数传递给它们。最后,我们启动并等待这两个进程执行完毕。运行该程序,你将看到生产者不断向队列中放入数据,而消费者则不断从队列中取出并处理数据。

2. 管道
        管道是另一种常用的进程间通信方式,它提供了一个全双工的通信机制,使得两个进程可以互相发送和接收数据。以下是使用管道实现进程间通信的示例:

import multiprocessingdef sender(conn, messages):for message in messages:conn.send(message)print("发送消息:", message)conn.close()def receiver(conn):while True:message = conn.recv()if message is None:breakprint("接收消息:", message)if __name__ == '__main__':parent_conn, child_conn = multiprocessing.Pipe()messages = ['Hello', 'World', 'Bye']p = multiprocessing.Process(target=sender, args=(child_conn, messages,))c = multiprocessing.Process(target=receiver, args=(parent_conn,))p.start()c.start()p.join()c.join()

        在上述示例中,我们首先使用`multiprocessing.Pipe()`创建了一对管道`parent_conn`和`child_conn`。然后,我们定义了一个发送者函数`sender`,用于向管道发送消息。接着,我们定义了一个接收者函数`receiver`,用于从管道接收消息。在主程序中,我们创建了一个发送者进程`p`和一个接收者进程`c`,并将管道`child_conn`和`parent_conn`传递给它们。最后,我们启动并等待这两个进程执行完毕。运行该程序,你将看到发送者不断向管道发送消息,而接收者则不断接收并打印出消息。

四、进程池
        在实际并发编程中,我们常常需要创建多个进程来执行任务。然而,频繁地创建和销毁进程会带来较大的开销。为了减少这种开销,我们可以使用multiprocessing模块提供的进程池。以下是使用进程池实现并行任务执行的示例:

import multiprocessingdef worker(task):print("执行任务:", task)if __name__ == '__main__':tasks = range(10)pool = multiprocessing.Pool()pool.map(worker, tasks)pool.close()pool.join()

        在上述示例中,我们首先定义了一个任务函数`worker`,用于执行具体的任务。在主程序中,我们创建了一个进程池`pool`,然后使用`pool.map()`方法将任务函数`worker`和任务列表`tasks`传递给进程池。进程池会自动分配任务给多个进程来执行,并返回结果。最后,我们使用`pool.close()`关闭进程池,并使用`pool.join()`等待所有进程执行完毕。运行该程序,你将看到任务并行执行的结果。

不知道人工智能如何学习?不知道单片机如何运作?不知道嵌入式究竟是何方神圣?搞不清楚什么是物联网?遇到问题无人可问?来我的绿泡泡交流群吧!里面有丰富的人工智能资料,帮助你自主学习人工智能相关内容,不论是基础的Python教程、OpenCV教程以及机器学习等,都可以在群中找到;单片机毕设项目、单片机从入门到高阶的详细解读、单片机的一系列资料也备好放入群中!关于嵌入式,我这里不仅仅有嵌入式相关书籍的电子版本,更是有丰富的嵌入式学习资料,100G stm32综合项目实战提升包,70G 全网最全嵌入式&物联网资料包,嵌入式面试、笔试的资料,物联网操作系统FreeRTOS课件源码!群内高手云集,各位大佬能够为您排忧解难,让您在学习的过程中如虎添翼!扫码进群即可拥有这一切!还在等什么?赶快拿起手机,加入群聊吧!二维码详情

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

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

相关文章

【Spring MVC篇】参数的传递及json数据传参

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得,欢迎大家在评论区交流讨论💌 目录 一、普通参数的传…

Nodejs基于vue的网上药店药品销售管理系统bxm50

该系统开发是基于B/S模式的,使用nodejs编程语言和js技术,框架使用vue框架,数据库采用MySQL数据库进行存储数据,使用HTML,CSS,等技术进行页面的布局和设计。系统编码使用vscode做开发工具, 系统设计包括几个主要的功能…

VitePress-12-markdown中使用vue的语法

前言 VitePress 中,markdown文档最终都会转换成为 html文件,我们在访问的时候,也是直接访问的 xxx.html 文件。而且,markdown文档会被作为 [vue单文件] 进行处理,因此,我们我们可以在文档中使用 vue 语法&…

MySQL索引怎么提高查询的速度?

目录 一、MySQL介绍 二、什么是索引 三、为什么要用索引 四、索引如何提高查询速度 一、MySQL介绍 MySQL是一个开源的关系型数据库管理系统(RDBMS),它是目前最流行和广泛使用的数据库之一。MySQL由瑞典MySQL AB公司开发,并在…

Python爬虫实战 | 京东平台电商API接口采集京东商品京东工业商品详情数据

item_get-获得JD商品详情API测试 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cac…

甘肃旅游服务平台:技术驱动的创新实践

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

《统计学简易速速上手小册》第1章:统计学基础(2024 最新版)

文章目录 1.1 数据类型和数据收集1.1.1 基础知识1.1.2 主要案例:顾客满意度调查1.1.3 拓展案例 1:产品销售分析1.1.4 拓展案例 2:员工绩效评估 1.2 描述性统计学1.2.1 基础知识1.2.2 主要案例:销售数据分析1.2.3 拓展案例 1&#…

Maven进阶

一、分模块开发与设计 1. 分模块开发的意义 问题导入 分模块开发对工程有什么好处? 模块拆分原则 目的:项目的扩展性变强了,方便其他项目引用相同的功能。 将原始模块按照功能拆分成若干个子模块,方便模块间的相互调用&#…

Qualcomm 蓝牙耳机 FAQ(41)---------Audio 问题分析之 ACAT Tools安装

大家好! 新的一年,在此祝大家:新年快乐!工作上步步高升!!龙年大吉!!! 也欢迎大家登录大大通平台,春节期间正常更新文章,期待你的到来&#xff0…

猫头虎分享已解决Bug || Go Error: Missing Return at End of Function

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

Transformer实战-系列教程13:DETR 算法解读

🚩🚩🚩Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 1、物体检测 说到目标检测你能想到什么 faster-rcnn系列,开山之作&…

【深度学习:MPT-30B】提高开源基础模型的标准

【深度学习:MPT-30B】提高开源基础模型的标准 MPT-30B家族MPT-30B (Base)MPT-30B-InstructMPT-30B-Chat使用 MosaicML Inference 部署 MPT-30B 模型通过 MosaicML 培训定制 MPT-30BLLM Foundry 下一步是什么? 附录致谢数据MPT-30B 8k 上下文窗口微调数据…