因为项目原因,所以选择了使用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多进程中的Manager的作用