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