线程进程 五 进程池

进程池

  • 方便创建,管理进程,单独进程的Process创建,需要手动开启,维护任务函数,以及释放回收
  • 进程池不需要这么麻烦,进程提前创建好,未来在使用的时候,可以直接给与任务函数
  • 某个进程池中的任务结束了,占用的进程会自己释放刚才工作的事情,以便接收下一个
Process(target=,args=,).start() join()
P = Pool(num) #创建一个包含有num个空闲进程的池子
p.apply() 填充任务,任务如果结束,会自动释放掉当前占用的进程
创建大规模任务,Pool(100)

from mutliprocessing import Pool

  • 创建进程池:进程池中的进程是可以复用

    • p = Pool(num)

      • num:指明当前多少空闲进程创建出来
    • p.apply(func,args,)

    • Process(target,args),Lock()

      • 阻塞行为
      • func:指明填充功能函数名
      • args:对应的参数
    • p.apply_async(func,args,)

      • 非阻塞行为,
    • **p.close() **

      • 在整个业务结束之后,进程池要首先关闭
      • 没有办法填充新的任务
    • p.join()

      • 进程回收,把关闭了的进程池中的每个进程join() 释放回收掉
    • p.terminate()

      • 直接关闭进程池,并且终止所欲偶进程
  • 进程池的工作的返回值:

    • res = p.apply(func,)
      • res就是进程池的工作结果
      • 立竿见影就可以看到结果,就因为apply填充任务是阻塞行为
    • res = p.apply_aysnc(func)
      • 非阻塞的结果,可以立即拿到,但是不是结果,只是一个抽象虚拟的值
        • 这个值代表进程结束后的返回值
      • res.get()
        • 当前非阻塞执行的进程,有优先级先结束
        • 强制要求立即这个结果,但是会影响进程之间的并发效果
  • Pipe() 进程池通信没有管道

  • Queue()

    • 进程池中的通信队列是特殊的

    • from multiprocessing import Manager

      array:共享内存,char short int long long unsizned# 周日上课:8点-9点半

实例 进程池数据通信

from multiprocessing import Pool,Manager,Queue
from time import sleep
import sys
import os
#pid,ppid = os.fork() #内核函数 
#if ppid == 0: 子进程
#if pid > 0: 父进程
def work_a(q):
	#生产者 放十次
	for var in range(10):
		print('生产者:',var) 
		sys.stdout.flush()
		q.put(var)
		sleep(1)
def work_b(q):
	#消费者,拿十次
	for var in range(10):
		res = q.get() #阻塞行为
		print('消费者:',var)
		sys.stdout.flush()
	#CPU 过来处理报错 终止进程,抛出错误
def main():
	q = Manager().Queue() #进程共享队列
	p = Pool(5) #进程可以复用
	p.apply_async(func=work_a,args=(q,))
	p.apply_async(func=work_b,args=(q,))
	p.close()
	p.join()
if __name__ == '__main__':
	main()

实例 进程池的工作结果如何获取

from multiprocessing import Pool
import sys
def work_a():
	for var in range(1,2000):
		print(var) 
		sys.stdout.flush()
	return 'a'
def work_b():
	for var in range(2000,4000):
		print(var)
		sys.stdout.flush()
	return 'b'
def work_c():
	for var in range(4000,6000):
		print(var)
		sys.stdout.flush()
	return 'c'
def main():
	p = Pool(4) #参数:可以最多同时执行任务个数,并不是填充的最大任务个数
	a = p.apply_async(func=work_a) 
	b = p.apply_async(func=work_b)
	c = p.apply_async(func=work_c)
	print('a进程:%s' % a.get()) #生成器
	print('b进程:%s' % b)
	print('c进程:%s' % c)
	p.close() #先关闭进程池,不代表进程池中的任务要停止
		#关闭了之后打不开了
	p.join()
if __name__ == '__main__':
	main()

实例 进程池

from multiprocessing import Pool
import sys
def work_a():
	for var in range(1,2000):
		print(var) 
		sys.stdout.flush()
def work_b():
	for var in range(2000,4000):
		print(var)
		sys.stdout.flush()
def work_c():
	for var in range(4000,6000):
		print(var)
		sys.stdout.flush()
def main():
	p = Pool(2) #参数:可以最多同时执行任务个数,并不是填充的最大任务个数
	#p.apply(func=work,args=(a,b),)
	p.apply_async(func=work_a)
	p.apply_async(func=work_b)
	p.apply_async(func=work_c)
	#?: 是否是阻塞行为执行完这三个任务
		#阻塞的话:1个等一个,同步
		#非阻塞:异步
	p.close()
	p.join()
if __name__ == '__main__':
	main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值