因为项目原因,所以选择了使用python作为工程开发的主语言。工程上在数据发送时,需要将一批数据快速的进行发送,所以很自然的就想到了Java中的多线程。但是坑爹的是python中的多线程是假的,python进程受GIL锁控制,同时只能有一个线程在运行,无法有效的利用CPU的多核,所以python中如果要做到类似Java中的多线程的功能的话,需要使用到python的进程池功能。
最初写的python多进程的例子如下:
from multiprocessing import Pool
import os, timedef 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的作用
版权归原作者 淡定一生2333 所有, 如有侵权,请联系我们删除。