本篇文章,我们会详细剖析python并发编程的一些概念还有编程方法,并且同时将所学,对一些大家常用的web框架并发处理进行分析。
基础概念
并发与并行
并发是一个进程下执行多个线程。而并行是针对机器利用多核处理程序。打个形象的比喻,并发就是一条路上正在走路的两个人或者更多人,而并行是两条路上同时在走的两个人算做并行。
进程
应用程序执行的基本处理单元,每个进程有自己的堆空间,代码段,数据段,进程控制块等
线程
线程是轻量级的进程。线程执行中,有自己线程id,程序计数器,栈空间, 共用进程的代码段和数据段,其他操作资源。 对于io密集型的处理,可以采用多线程(创建线程池)。
协程
允许程序执行中进行悬挂并能够恢复执行,python是通过yield来实现的,yield就是在程序执行半途中,进行悬挂,并不对函数栈进行释放。yield 回调则继续之前的执行。
GIL
字面理解就是全局解析锁,这个GIL是在实现cpython解析器过程中用到的锁,原因有二,其一 ,the main reason for the GIL in CPython is because of the reference counting GC system 垃圾回收机制,如果没有这把锁,资源的回收就会回收多次,导致不可预料的问题。其二,保证并发解析的正确性,引入了这个锁。(详细了解,必须了解cpython的垃圾回收机制和这个锁的关系,还有Jython是如何避免这个问题,以后在分析)
编码
# 进程,Queue可以作为线程和进程之间传递消息,还有管道也可传递进程间消息
from multiprocessing import Pool
def f(x):
return x*x
def __name__ == "__main__":
p = Poll(5)
# map能够充分利用多核进行并行计算
print p.map(f, range(10))
# 线程
#encoding=utf-8
from threading import Thread
import time
ab = 0
def f(x):
global ab
ab = x*x
th = Thread(target=f,name="wahah", args=(123,))
th.start()
th.join()
print ab
# 协程
利用yield实现,send(x)发送数据,yield x 返回数据
网友评论