0


Python进程池未并行执行的一个小坑

因为项目原因,所以选择了使用python作为工程开发的主语言。工程上在数据发送时,需要将一批数据快速的进行发送,所以很自然的就想到了Java中的多线程。但是坑爹的是python中的多线程是假的,python进程受GIL锁控制,同时只能有一个线程在运行,无法有效的利用CPU的多核,所以python中如果要做到类似Java中的多线程的功能的话,需要使用到python的进程池功能。

最初写的python多进程的例子如下:

from multiprocessing import Pool
import os, time

def task(name):
print 'Run task %s (%s)...' % (name, os.getpid())
time.sleep(3)
print 'Task %s runs finished' % (name)
return os.getpid()

if name=='main':
# manager用户python多进程间数据安全的通信
manager = multiprocessing.Manager()
# 父进程创建进程安全的Queue
q = manager.Queue()
p = Pool(5)
print 'Parent process %s.' % os.getpid()

all_results=[]
 for i in range(5):
     all_results.append(p.apply_async(task, args=(i,)).get())
 print 'Waiting for all subprocesses done...'
 p.close()
 p.join()
 print 'All subprocesses done.'
但是在程序运行时发现并没有并行执行,还是先执行完一个task,再执行下一个task。各种尝试之后发现问题出现在get()那里,get会阻塞主进程。

所以apply_async()方法之后不能接get(),将返回结果直接赋值给一个变量即可,然后慢慢等待多进程程序执行完毕。修改之后,方法如下所示:
all_results=[]
 for i in range(5):
     ret = p.apply_async(task, args=(i,))
     all_results.append(ret)
 print 'Waiting for all subprocesses done...'
 p.close()
 p.join()
害,其实是个小问题,记录下。“人生苦短,我用python”,害,但个人还是不想用python做工程,哈哈哈

参考:

    python中多线程是假的

    python多进程中的Manager的作用
标签: python

本文转载自: https://blog.csdn.net/zc19921215/article/details/120643255
版权归原作者 淡定一生2333 所有, 如有侵权,请联系我们删除。

“Python进程池未并行执行的一个小坑”的评论:

还没有评论