发布时间:2020-03-10 18:35:28来源:阅读:
python版本:2.7.5
Python的GIL会对CPU密集型的程序产生影响,如果完全使用Python来编程,怎么避开GIL的限制呢?
在多线程中使用进程池来规避GIL的限制。具体如下:
1、使用multiprocessing模块来创建进程池;
2、将计算任务分配给不同的线程;
3、在任务线程中把任务提交给之前创建的进程池;
每当有线程要执行cpu密集型任务时,就把该任务提交到进程池中,然后进程池会将任务交给运行在另一个进程中的Python解释器。
当线程等待结果时会释放GIL,而此时的计算任务是在另一个单独的Python解释器中执行的,不再受到GIL的限制了。
在多核系统中采用这个方案能轻易地利用到所有的CPU核心。
假设有这样的worker函数:
def worker(arr):
s = 0
for n in arr :
arrTmp = range(1,n+1)
if len(arrTmp) == 0 : continue
rtmp = 1
for i in arrTmp :
rtmp *= i
s += rtmp
return s
完整代码如下:http://github.com/mike-zhang/pyExamples/blob/master/gilAvoid/gilAvoidTest1/taskCommon.py
普通单进程任务实现:
def main():
s = 0
tStart,tStop = 1,1000
for i in range(1,100):
#t = worker(range(tStart,tStop))
t = worker(range(1,1000))
s += t
tStart = tStop
tStop += 1000
print("len : ",len(str(s)))
print(s%10000)
完整代码如下: http://github.com/mike-zhang/pyExamples/blob/master/gilAvoid/gilAvoidTest1/t1_normal.py
运行效果如下:
(py27env) [mike@localhost test]$ time python t1_normal.py
('len : ', 2567)
987
real 0m17.919s
user 0m17.915s
sys 0m0.003s
使用进程池的实现:
def wokerThread(start,stop):
#r = gPool.apply(worker,(range(start,stop),))
r = gPool.apply(worker,(range(1,1000),))
q.put(r)
def main():
s = 0
thrdArr = []
tStart,tStop = 1,1000
for i in range(1,gCount+1):
thrd = threading.Thread(target=wokerThread,args=(tStart,tStop))
thrdArr.append(thrd)
tStart = tStop
tStop += 1000
for t in thrdArr :
t.daemon = True
t.start()
while not q.full(): time.sleep(0.1)
while not q.empty(): s += q.get()
print("len : ",len(str(s)))
print(s%10000)
完整代码如下:http://github.com/mike-zhang/pyExamples/blob/master/gilAvoid/gilAvoidTest1/t2_mp.py
运行效果如下:
(py27env) [mike@localhost test]$ time python t2_mp.py
queue full
('len : ', 2567)
987
real 0m4.917s
user 0m18.356s
sys 0m0.146s
可以看出使用上述方法可以规避GIL的限制(测试机器为i5 4核),程序的速度得到明显的提升。
好,就这些了,希望对你有帮助。
本文github地址:
http://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20170819_使用进程池规避python的GIL限制.rst
2020-04-02
当将外接显示器设置为高分辨率时该显示器上的屏幕位置不正确
在docker swarm集群中使用HEALTHCHECK解决服务更新不可用的问题
史上最便宜的IOS设备!只要1599就能买到
联想PC Windows系统下标配设备驱动程序安装方法详解
Miix510手写笔按键设置
驱动和软件下载列表 ThinkPad A22e (Software and Device Drivers )
如何重新安装Flash Player
如何关闭手机通知栏中的百度搜索框
成才学院(新联想100分学校2012版)如何续费?