python学习7---多进程

一、介绍

多进程是指在同一程序中创建多个独立的进程来执行任务。每个进程都有自己独立的内存空间,相互之间不干扰。

因为GIL锁的存在,对于CPU密集型任务(例如计算密集型操作),使用多进程可以提高程序的效率。
优点:

1.可以利用多核CPU,提高计算效率。

2.每个进程独立运行,安全性高。

二、使用

Python提供了multiprocessing模块来实现多进程。

注意:

1.multiprocessing.Process 用于创建进程。target参数指定了进程要执行的函数,args参数传递给该函数的参数。

2.使用 start()方法启动进程。

3.join()方法使主进程等待子进程完成。

python 复制代码
import multiprocessing 
import time 

def worker(name):
	print(f"Worker { name} starting")
	time. sleep(2)
	print(f"Worker { name} finished")

if __name__ == '__main__':
	processes -[]
	for i in range(5):
		p = multiprocessing. Process(target=worker, args=(i,))
		processes. append(p) 
		p. start()
	
	for p in processes: 
	p. join()
	print("A11 workers finished")
python 复制代码
Worker 0 starting
Worker 1 starting
Worker 2 starting
Worker 3 starting
Worker 4 starting
Worker 0 finished
Worker 1 finished
Worker 2 finished
Worker 3 finished
worker 4 finished
All workers finished

三、进程池

进程池是一种预先创建的一组工作进程,这些进程可以重复使用来执行多个任务。通过进程池,可以避免频繁创建和销毁进程的开销,从而提高效率。
4.1 进程池的使用

Python的 multiprocessing 模块提供了Pool类来实现进程池。

python 复制代码
from multiprocessing import Pool 
import time 

def worker(num):
	print(f"Worker { num} starting")
	time. sleep(2)
	print(f"Worker { num} finished") 
	return num * num 

if __name__ == 'main': 
	with Pool(processes-4) as pool: 
		results = pool.map(worker, range(10))
	print("Results:", results)

1.创建进程池 :使用 Pool(processes=4)创建一个包含4个进程的进程池。
2.提交任务 :pool.map(worker,range(10))将 worker函数应用到 range(10)中的每一个元素,并将任务分配给进程池中的进程去执行。
3.获取结果:map方法会阻塞主进程,直到所有任务完成,并返回结果列表。

python 复制代码
Worker 0 starting 
Worker 1 starting
Worker 0 finished
Worker 1 finished 
Worker 2 starting 
Worker 3 starting
Worker 2 finished
Worker 4 starting 
Worker 3 finished 
Worker 4 finished 
Results:[0,1,4, 9,16]

4.2 常用方法
apply和apply_async:

apply(func,args):同步执行,类似于普通函数调用,阻塞主进程直到任务完成。

apply_async(func,args):异步执行,不阻塞主进程,通过回调函数获取结果。

python 复制代码
from multiprocessing import Pool 

def worker(num):
	return num*num 

def print result(result):
	print("Result:",result)

if __name__ == 'main':
	with Pool(processes=4)as pool:
		#同步等待结果
		result = pool.apply(worker,(10,))
		print("Synchronous Result:",result)
		
		#异步等待结果
		pool.apply_async(worker,(20,),callback=print_result)
		pool.close()
		pool.join()

map和 map_async:

使用该方法传参数时,将iterable的每个元素作为参数,相当于一次提交多个任务。

map(func,iterable):同步映射,阻塞主进程直到所有任务完成,返回结果列表。

map_async(func,iterable):异步映射,不阻塞主进程,通过回调函数获取结果。

python 复制代码
from multiprocessing import Pool 

def worker(num): 
	return num * num 

def print result(results): 
	print("Results:", results) 

if __name__ == 'main': 
	with Pool(processes=4) as pool:
	#同步
	results = pool.map(worker, range(10)) 
	print("Synchronous Results:", results) 
	# 异步
	pool.map async(worker, range(10), callback=print_result)
	pool. close()
	pool.join()

starmap 和 starmap_async :

starmap(func, iterable_of_tuples):类似于map,但可以传递多个参数。

starmap_async(func, iterable_of_tuples): 异步版本的 starmap

python 复制代码
from multiprocessing import Pool 

def worker(x, y):
	return x * y
def print_result(results): 
	print("Results:", results) 

if __name__ == 'main':
	with Pool(processes=4) as pool:
		#同步
		results = pool.starmap(worker, [(1, 2), (3, 4), (5, 6)])
		print("Synchronous Results:", results)
		#异步
		pool.starmap_async(worker, [(1, 2), (3, 4), (5, 6)], callback=print_result) 
		pool.close()
		pool.join()

先试用pool.close()关闭进程池,防止更多的任务提交到该池,才可以执行pool.join()阻塞主进程,等待所有子进程完成。

相关推荐
李小星同志39 分钟前
高级算法设计与分析 学习笔记6 B树
笔记·学习
霜晨月c1 小时前
MFC 使用细节
笔记·学习·mfc
鸽芷咕1 小时前
【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘
开发语言·python·机器学习·bug·paddle
小江湖19941 小时前
元数据保护者,Caesium压缩不丢重要信息
运维·学习·软件需求·改行学it
子午1 小时前
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
人工智能·python·cnn
风等雨归期1 小时前
【python】【绘制小程序】动态爱心绘制
开发语言·python·小程序
Adolf_19931 小时前
Flask-JWT-Extended登录验证, 不用自定义
后端·python·flask
冯宝宝^1 小时前
基于mongodb+flask(Python)+vue的实验室器材管理系统
vue.js·python·flask
dot.Net安全矩阵1 小时前
.NET内网实战:通过命令行解密Web.config
前端·学习·安全·web安全·矩阵·.net
叫我:松哥2 小时前
基于Python flask的医院管理学院,医生能够增加/删除/修改/删除病人的数据信息,有可视化分析
javascript·后端·python·mysql·信息可视化·flask·bootstrap