在这里插入图片描述


Process类
# 创建一个进程(仅介绍,创建一个进程没啥意义嘛,哈哈!)
import multiprocessing
def test(i):
	print(i)
if __name__ == '__main__':
	process1 = multiprocessing.Process(target=test,args=('jack',))  
	# 这就是开启进程的方法,target为要运行的函数,args为需要向将要运行的函数传入的参数。
	# 单个参数后加上,(逗号)表示传入的参数是可以迭代的,单个参数时必须加上,
	process1.start()   # 开始刚刚创建的新进程
	process1.join()     
	'''
	join是用于等待所有子进程结束后才结束主进程的方法,若有疑问可查看我之前的介绍join方法的文章
	https://blog.csdn.net/keepaware/article/details/108432899
	'''
# 创建多个进程
import multiprocessing
def test(i):
	print(i)
if __name__ == '__main__':
	record = []   # 创建一个record列表用于储存产生的进程,利于后续的join操作
	for p in range(4):  # 使用for循环用于后续创建四个进程
		process = multiprocessing.Process(target=test,args=(p,))  
		''' 
		这里要注意,如果每次的参数都输入一样的,这样每个进程都会运行一样的任务,也就是说每个进程都是从
		头开始运行。这就可能会导致结果不尽人意,不要问我为啥知道,呜呜!因此需要自己设计方法来避免这个
		坑,例如制作一个参数列表,从列表中提取每个参数。后续还有map方法也可匹配列表
		'''
		process.start()   
		# 开始创建的新进程,此处不调用join是因为调用后主进程会等待每个子进程结束后才开始下个子进程
		record.append(process)   # 将每个创建的进程都放入record列表中
	for process in record:
		process.join()     
		# 从record列表中提取每个子进程使用join方法,此时子进程都已经在运行了,再等待每个子进程都结束即可
Pool类(进程池)
Pool.map()
# 进程池即创建一个进程库,事先设置好需要多少进程,从进程库中提取这些已创建的进程即可。
# Pool.map()
import multiprocessing
def test2(i):
	print(i)
if __name__ == '__main__':
	list1 = list(range(5))  # 创建一个列表,map方法会用到
	pool1 = multiprocessing.Pool(processes=4)  # 创建一个进程池,这里创建了含有4个进程的进程池
	pool1.map(test2,list1)   
	'''
	对pool1使用map方法,在这个例子中即形成(test2(0),test2(1),test2(2),test2(3),test2(4) 这些任务)
	这些将执行的任务是按顺序执行的,也就是说进程1执行test2(0),进程2执行test2(1),进程3执行test2(2)进程4执行test2(3),还多出一个任务则需要等待,等到某个进程提前结束了就再执行这个任务。
	这样的话相当于一个进程执行一次单独的任务,十分方便某些任务
	如果函数有返回值即return,还可以使用result = pool1.map(test2,list1)获取每个进程的返回值,
	但是这里是所有返回值在一起,需要自己对其按需处理。
	'''
	pool1.close()  # close方法用于关闭进程池,即恢复到没有子进程的情况
	pool1.join() 
Pool.apply_async()

除了apply_async外还有apply,不过apply已经近乎被淘汰了,因为apply是阻塞的,需要一个进程结束才能开始下个进程。此方法使用方式类似于process方法,是一种异步非阻塞执行多进程的方式,但是需要在进程池的基础下进行

# 使用Pool.apply_async() 创建一个进程
import multiprocessing
def test3(i):
	print(i)
if __name__ == '__main__':
	with multiprocessing.Pool(processes=4) as pool:  # 使用with方法不用后续关闭Pool
		result = pool.apply_async(test3,args=('jack',))  # 此处同上,参数不变的话执行的是同一任务
		res = result.get()  # get方法可以获取进程的返回值,此处可以使用res进行后续操作		
# 创建多个进程
def test4(i):
	print(i)
if __name__ == '__main__':
	res_list = []
	with multiprocessing.Pool(processes=4) as pool:
		for p in range(10):
			ret = pool.apply_async(test4,args=(p,))
			ret_list.append(ret)
		for ret in ret_list:
			ret.get()

若是想对不同的任务进行多进程操作,也是相当简单的,因为实际上每个多进程操作结束后都是会关闭或者join的,因此在每个多进程操作结束后再开启新的多进程任务即可

例:

import multiprocessing
def test5(i):
	print(i)
if __name__ == '__main__':
	list1 = list(range(10))
	res_list = []
	for item in list1:	
		with multiprocessing.Pool(processes=4) as pool:
			for p in range(item):
				ret = pool.apply_async(test5,args=(p,))
				ret_list.append(ret)
			for ret in ret_list:
				ret.get()
		
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐