Python多任务处理---多进程

        在Python中,进程(Process)是操作系统分配资源和调度的基本单位。每个进程都拥有自己独立的内存空间和资源,进程之间的通信需要特殊的机制来实现,比如管道(pipe)、信号(signal)、共享内存、套接字等。Python通过multiprocessing模块提供了丰富的进程管理功能,这个模块允许程序创建、同步和通信多个进程,以此来利用多核CPU的优势来提高程序的执行效率。 

进程(Process)

        进程是操作系统进行资源分配和调度的一个独立单位,是程序的一次执行实例, 是操作系统结构的基础,每个进程都有自己独立的内存空间,数据段,代码段和堆栈。

进程ID(PID)

        每个进程都有一个唯一的标识符,称为进程ID,或PID。这是系统用来跟踪和管理进程的一种方式。

子进程(Child Process)

        当一个进程创建了另一个进程,被创建的进程被称为子进程。子进程可以独立于创建它的进程运行,但通常子进程的结束和资源回收需要父进程来负责。

进程同步(Process Synchronization)

        在多进程环境中,确保进程以安全的顺序执行,以此来避免诸如数据不一致、资源竞争等问题。

进程间通信(Inter-process Communication, IPC)

        由于每个进程拥有自己的地址空间,直接的数据共享是不可能的。因此,操作系统提供了多种IPC机制,如管道、消息队列、信号量等,以实现进程间的数据交换。

代码演示

不使用进程的例子:

#不使用进程的例子:
from time import sleepdef run():while True:print('sunck is a nice man!')sleep(1)if __name__ == '__main__':while True:print('sunck is a good man!')sleep(1)# 不会执行到run方法,只有上面的while执行结束才会执行run()

使用进程的简单例子:

'''
fork()创建进程只能在linux中,windows不支持fork()
multiprocessing库
跨平台版本的多进程模块,提供了一个Process类来创建一个进程对象
'''from multiprocessing import Process
from time import sleepdef run():while True:print('sunck is a nice man!')sleep(1.5)if __name__ == '__main__':print('主(父)进程启动!')# 创建一个子进程p = Process(target=run)# 启动进程p.start()while True:print('sunck is a good man!')sleep(1)

查看进程号:

from multiprocessing import Process
from time import sleep
import os# 子进程需要执行的代码
def run(str):while True:# os.getpid()获得进程号,os.getppid()获得父进程的进程号。print('sunck is a %s man,%s-%s!'%(str, os.getpid(), os.getppid()))print('子进程进程号:', os.getpid())#可以打开进程管理器去看sleep(1.5)if __name__ == '__main__':print('主(父)进程启动%s!'%(os.getpid()))# 创建一个子进程p = Process(target=run, args=('nice',))# 启动进程p.start()while True:print('sunck is a good man!')sleep(1)

查看父子进程的先后顺序例子:

from multiprocessing import Process
from time import sleepdef run(str):print('子进程启动啦!!')sleep(3)print('子进程结束!!')if __name__ == '__main__':print('父进程启动啦!')p = Process(target=run, args=('Nice',))p.start()# 父进程的结束不能影响子进程!print('父进程结束!')

多进程应用 

        把一个含有120个文件的文件夹中的数据读取到另一个文件夹,可以设置三个进程分别去读取,每个进程去干一部分工作。

多进程实现文件拷贝

使用Python的multiprocessing模块实现多进程文件拷贝的一个简单示例可以按照以下步骤进行:

1.确定文件列表:首先,需要确定要拷贝的文件列表。
2.创建进程执行拷贝:对于每个文件,创建一个进程来执行拷贝操作。
3.监控进程状态:主进程可以等待所有子进程完成,确保所有文件都被拷贝。

下面是一个简单的实现示例:

import os
from multiprocessing import Processdef copy_file(source, destination, filename):"""拷贝单个文件的函数"""source_path = os.path.join(source, filename)destination_path = os.path.join(destination, filename)with open(source_path, 'rb') as f_src:with open(destination_path, 'wb') as f_dst:while True:# 读取文件内容data = f_src.read(1024)  # 以1024字节块读取if not data:break  # 文件结束# 写入到目标文件f_dst.write(data)print(f'{filename} 拷贝完成')def main(source, destination):# 确保目标目录存在if not os.path.exists(destination):os.makedirs(destination)# 获取源目录中的所有文件filenames = os.listdir(source)# 创建并启动进程processes = []for filename in filenames:p = Process(target=copy_file, args=(source, destination, filename))p.start()processes.append(p)# 等待所有进程完成for p in processes:p.join()print("所有文件拷贝完成。")if __name__ == '__main__':source_dir = '/path/to/source'  # 源目录路径destination_dir = '/path/to/destination'  # 目标目录路径main(source_dir, destination_dir)

在这个示例中,copy_file函数负责拷贝单个文件。main函数首先确保目标目录存在,然后获取源目录中的所有文件,并为每个文件创建一个进程来执行拷贝操作。最后,main函数等待所有拷贝进程完成。

需要注意的是,这个示例假设所有的文件都在源目录的根目录下,并且没有考虑子目录的情况。如果源目录结构更加复杂,涉及到子目录的拷贝,那么代码需要进行相应的调整,例如递归地创建进程来处理子目录中的文件。

此外,使用多进程进行文件拷贝时,如果拷贝的文件数量非常大,创建过多的进程可能会对系统性能产生负面影响。在这种情况下,可以考虑使用进程池(multiprocessing.Pool)来限制同时运行的进程数量。

参考文档

下面分享一些自己研究是参考的相关博客及文档: 

1.这里有python3.7.8的进程相关文档,讲的很全面但是感觉有点啰嗦。链接:multiprocessing --- 基于进程的并行 — Python 3.7.13 文档

 2.多进程处理显示图片的demo:https://download.csdn.net/download/mzl_18353516147/12639490

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

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

相关文章

nRF52832/52840怎么将NFC引脚配置成通用IO(P0.09,P0.10)

对于Nordic SDK的程序架构来说,引脚的NFC功能和Reset功能主要是在system_nrf52.c,跳转进main函数前执行SystemInit进行初始化的。代码如下 void SystemInit(void) {....../* Configure NFCT pins as GPIOs if NFCT is not to be used in your code. If …

Kimi和ChatGPT做古诗词阅读理解,谁更胜一筹?

前几天发过一篇Kimi整理会议的体验教程,没想到大家很感兴趣,这次再来拿Kimi做古诗词阅读理解看看,同时也对比下ChatGPT的效果。 ChatGPT是几乎家喻户晓的AI大模型,Kimi和它对比有哪些异同点呢? 首先它们都是基于对话…

docker容器添加新端口映射的步骤及`wsl$`目录的作用

在Docker容器已经创建后,需要添加新的端口映射,即对已经存在的Docker容器添加新的端口映射,可以通过以下步骤来添加,即通过修改配置文件的方法。 如何新增端口映射? 查找容器的hash值 docker inspect [容器id或名称…

docker-compse安装es(包括IK分词器扩展)、kibana、libreoffice

Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。 Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据…

DTW-KNN 用于液压故障检测(python)

1 介绍 本文提取特征,然后用于液压故障检测,每一条特征都是时间序列问题,所以使用了DTW-KNN模型,该模型的原来不做解释,大家可以自行查找。 2 数据集介绍 所有数据都在文件夹下,这是一个公开数据集&…

PFA(可溶性聚四氟乙烯)弯嘴洗瓶

PFA材质,又称可溶性聚四氟乙烯,是进口的高纯原材料,耐强酸强碱耐腐蚀和各种有机溶剂。 常用规格:30ml/60ml/100ml/250ml/500ml 产品特性 1、耐高低温:使用温度可达-200~260℃; 2、可打刻度,高度透明&#x…

【Linux】自定义协议+序列化+反序列化

自定义协议序列化反序列化 1.再谈 "协议"2.Cal TCP服务端2.Cal TCP客户端4.Json 喜欢的点赞,收藏,关注一下把! 1.再谈 “协议” 协议是一种 “约定”。在前面我们说过父亲和儿子约定打电话的例子,不过这是感性的认识&a…

捷途山海T2正式开启预售,新能源方盒子SUV仅售18.49万起

4月2日,捷途汽车宣布,定位为“旅行越野超混SUV”的山海T2正式开启预售。新车共计将推出3款不同配置车型,预售价格区间为18.49万-21.69万元。同时,预售期间捷途官方还将为用户推出7重预售礼。 山海T2是捷途山海系列第二款产品&…

testbench中一些常用的系统命令

前言 记录一下自己仿真过程中用到过的一些用于testbench的系统命令,根据自己用到的情况不定时进行补充。 文件操作 $fopen 用于打开文件的命令,格式如下 file $fopen("file_name","mode") file_name:要打开的文件…

innovus:add text脚本

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 genPinText text.rpt -cells [dbGet top.name] set in [split [exec cat text.rpt] "\n"] foreach line $in { lassign $line name x y layer cell set pt_x [str…

linux监控命令全

1.1 top 1.1.1 命令说明 Top 命令能够实时监控系统的运行状态,并且可以按照cpu、内存和执行时间进行排序 1.1.2 用法 top -hv | -bcisSHM -d delay -n iterations [-u user | -U user] -p pid [,pid ...] 1.1.3 参数说明 命令行启动参数: -b : 批次…

小白的第一次sql注入实战

前言 当时最初接触安全的时候拿下的第一个shell,还是比较兴奋的,忽略一下文章写的很水。 有id尝试sql注入 找这种sql注入的站用sql检索就行了,但是最好挂代理用谷歌搜索,百度的话搜sql注入的很多被别人打过了,导致链…