首页 > 代码库 > python基础26 -----python进程及协成
python基础26 -----python进程及协成
一、进程
1、multiprocessing模块实现多进程并发。
1.1multiprocessing包是Python中的多进程管理包,与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程 该进程可以运行在Python程序内部编写的函数,属于父进程和子进程的关系。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。
1.2Process类的简绍
构造方法:
Process([group [, target [, name [, args [, kwargs]]]]])
group: 线程组,目前还没有实现,库引用中提示必须是None;
target: 要执行的方法;
name: 进程名;
args/kwargs: 要传入方法的参数。
实例方法:
is_alive():返回进程是否在运行。
join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。
start():进程准备就绪,等待CPU调度
run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。
terminate():不管任务是否完成,立即停止工作进程
属性:
daemon:和线程的setDeamon功能一样
name:进程名字。
pid:进程号。
1.3、实例操作
2、进程间通信方法——进程队列
2.1进程队列queue,与线程队列相似,如图所示:
2.2管道(pipe),如图所示:
注释:Pipe()返回的两个连接对象代表管道的两端。 每个连接对象都有send()和recv()方法(等等)。 请注意,如果两个进程 (或线程)尝试同时读取或写入管道的同一端,管道中的数据可能会损坏。
2.3manager()进程之间数据共享,如图所示:
注释:父进程必须等到子进程执行完成后才能执行下一步。
Queue和pipe只是实现了数据交互,并没实现数据共享,但是manager是一个进程去更改另一个进程的数据.
3、进程池
3.1什么是进程池?
进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程序列,如果进程池中没有可供使用的进程序列,那么程序就 会等待,直到进程池中有可用进程序列为止。
3.2如图所示:
进程池中有以下几个主要方法:
apply:从进程池里取一个进程并执行
apply_async:apply的异步版本,一次性取完后再执行
terminate:立刻关闭线程池
close:等待所有进程结束后,才关闭线程池
join:主进程等待所有子进程执行完毕,必须在close或terminate之后
二、协成
1、什么是协成?
协程,又称微线程,纤程。英文名Coroutine,协程是一种用户态的轻量级线程。
2、协成特点
协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器 上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状 态,换种说法:进入上一次离开时所处逻辑流的位置。
3、yield与协成,如图所示:
4、greenlet实现协成
greenlet机制的主要思想是:生成器函数或者协程函数中的yield语句挂起函数的执行,直到稍后使用next()或send()操作进行恢复为止。 可以使用一个调度器循环在一组生成器函数之间协作多个任务。greentlet是python中实现我们所谓的"Coroutine(协程)"的一个基础库.
5、gevent实现协成
注释:同比之前上面两个实现协成的方式而言,当gevent实现协成遇到IO操作时会切换到下一个任务中,大大的节省了cpu执行程序的 时间
注释:
协程的好处:无需线程上下文切换的开销,无需原子操作锁定及同步的开销;方便切换控制流,简化编程模型;高并发+高扩展性+低成 本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。
缺点:无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU 上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序
python基础26 -----python进程及协成