'''
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态生成多个进程
但是如果是上百个或者上千个目标,手动去创建进程的工作量很大,此时就可以利用到Multiprocessing模块提供的Pool方法
初始化pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满
那么就会创建一个新的进程来执行该请求;但是如果池中的进程数量已经达到指定的最大值,那么该请求会等待
直到池中有进程结束,才会创建新的进程来执行
阻塞式:添加一个执行一个,如果一个任务不结束宁外一个任务就进不来
非阻塞式:全部添加到队列中,立刻返回,并没有等待其它进程执行完毕,但是回调函数是等地啊任务完成之后才调用。
好处:设置进程数量,达到进程的复用
'''
'''
pool=Pool(max) 创建进程池对象
pool.apply()阻塞的
pool.apply_async()非阻塞的
pool.close()停止添加进程
pool.join()#让主进程让步
queue 进程通信
'''
import os
from multiprocessing import Pool
#非阻塞式进程
import time
from random import random
from multiprocessing import Queue
q=Queue(6)
q.put('A')
q.put('B')
q.put('C')
q.put('D')
# q.put('E')
print(q.qsize())
if not q.full():
q.put('F',timeout=3)#put() 如果queue满了则只能等待,除非有空地则添加成功
else:
print('队列已满')
print('++++++++++')
print(q.get())
print(q.get())
print('++++++++++')
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get(timeout=2))
print(q.put_nowait("E"))
print('++++++++++')
print(q.get_nowait())
print('---')
#进程通信
from multiprocessing import Process,Queue
import time
def download(q):
images=['girl.jpg','boy.jpg','man.jpg']
for image in images:
print("正在下载:%s"%image)
time.sleep(1)
q.put(image)
def getfile(q):
while True:
try:
file=q.get(timeout=5)
print(f'{file}保存成功')
except:
print("全部保存成功")
break
if __name__=='__main__':
q = Queue(5)
p1=Process(target=download,args=(q,))
p2=Process(target=getfile,args=(q,))
p1.start()
p2.start()
p2.join()
p1.join()
#进程,线程
#Process类
#def func(n):
# pass
#创建进程:p=Process(target=func,name='',args=(1,),kwargs='')
#启动p.start()
#run()
from multiprocessing import Process
class MyProcess(Process):
def run(self):
pass
p=MyProcess()
p.start()
#进程的数据共享
n=0
#进程池:Pool
from multiprocessing import pool
p=pool(5)
#阻塞式 apply(func,args,kwargs)
#非阻塞式 apply_async(fun,args,kwargs,callback=函数)
# 进程间的通信 queue
from multiprocessing import Queue
q=Queue(4)
q.put()
q.get()
q.qsize()
q.empty()
q.full()
#线程关系
# 包含关系
#进程里面可以存着多个线程,多个线程可以共用进程资源
from threading import Thread
t=Thread(target=func,name='',args=(1,),kwargs='')
t.start()