在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