? ? 因为项目原因,所以选择了使用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的作用
|