Python基础(八)-系统编程之进程--multiprocessing(阻塞非阻塞)

进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。

线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。

协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度


	multiprocessing模块提供了process类来代表一个进程对象。
	语法结构:
	process([group[,target[,name[,args[,kwargs]]]]])
	target:表示进程实例所调用的对象
	args表示调用对象的位置参数元组
	kwargs表示调用对象的关键字参数字典
	name:为当前进程实例的别名



创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start方法启动,

用join()方法可一个等待子进程结束后再继续往下运行。一般用于进程间的同步


process类常用方法:

is_alive().判断进程实例是否还在执行

join([timeout]):是否等待进程实例执行结束,或等待多少秒

start()启动进程实例,即创建子进程

run()如果没有给定target参数,对对象调用start()方法时,就将执行对象中的run方法;

terminate()不管任务是否完成,立即终止。



进程池:

当创建的子进程数量不多时,可以直接利用process动态生成多个进程,当需要创建的进程数非常大的时候,需要用到进程池,即multiprocessing模块提供的Pool方法。

初始化pool时,可以指定一个最大进程数。有新的请求提交到pool中时,如果池还没满,就会创建一个新的进程来执行该请求,如果翅中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行。

from multiprocessing import Pool
import os,time,random

def worker(msg):
    t_start = time.time()
    print("%s开始执行,进程号为%d"%(msg,os.getpid()))
    #random.random()随机生成0~1之间的浮点数
    time.sleep(random.random()*2) 
    t_stop = time.time()
    print(msg,"执行完毕,耗时%0.2f"%(t_stop-t_start))

po=Pool(3) #定义一个进程池,最大进程数3
for i in range(0,10):
    #Pool.apply_async(要调用的目标,(传递给目标的参数元祖,))
    #每次循环将会用空闲出来的子进程去调用目标
    po.apply_async(worker,(i,))

print("----start----")
po.close() #关闭进程池,关闭后po不再接收新的请求
po.join() #等待po中所有子进程执行完成,必须放在close语句之后
print("-----end-----")

apply_async(func[,args[,kwds]]):使用非阻塞方式调用func(并行执行:同时执行两个或更多个处理,并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间)。阻塞方式:必须等上一个进程退出才能执行下一个进程。

args为传递给func的参数列表,kwds为传递给func的关键字参数列表。

apply(func[,args[,kwds]]):使用非阻塞方式调用func

close()关闭POOL,使其不再接受新的任务。

terminate():不管任务是否完成,立即终止

join():主进程阻塞,等待子进程的退出,必须在close或terminate之后使用。


阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

非阻塞和阻塞的概念想对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。







你可能感兴趣的:(Python基础(八)-系统编程之进程--multiprocessing(阻塞非阻塞))