首页 > 编程语言 > 详细

Python的multiprocessing模块学习

时间:2016-03-10 12:53:57      阅读:261      评论:0      收藏:0      [点我收藏+]


1.基本介绍

multiprocessing模块可以衍生出子进程。multiprocessing模块同时提供本地和远程的并发操作。multiprocessing模块不像threading模块那样会受到GIL全局解释器锁的限制,它使用进程代替线程。基于这样的特性,multiprocessing模块可以让程序员在一台服务器上使用多个处理器。

In [106]: from multiprocessing import Pool

In [107]: def f(x):
   .....:     return x*x;
   .....: 

In [108]: if __name__ == ‘__main__‘:
   .....:     p=Pool(5)
   .....:     print(p.map(f,[1,2,3]))
   .....:     
[1, 4, 9]



在multiprocessing模块中,子进程是通过一个Process对象生成的。然后调用start()函数

In [116]: from multiprocessing import Process

In [117]: def f(name):
   .....:     print ‘hello‘,name
   .....:     

In [118]: if __name__ == ‘__main__‘:
   .....:     p=Process(target=f,args=(‘john‘,))
   .....:     p.start()
   .....:     p.join()
   .....:     
hello john


如果要查看各自的进程ID,可以使用以下代码

#!/usr/sbin/python

from multiprocessing import Process
import os

def info(title):
    print title
    print ‘module name:‘,__name__
    if hasattr(os,‘getppid‘):
       print ‘parent process:‘,os.getppid()
    print ‘process id:‘, os.getpid()

def f(name):
    info(‘function f‘)
    print ‘hello‘,name

if __name__ == ‘__main__‘:
   info(‘main line‘)
   p = Process(target=f,args=(‘john‘,))
   p.start()
   p.join()


main line
module name: __main__
parent process: 17148
process id: 18168
function f
module name: __main__
parent process: 18168
process id: 18169
hello john


2.进程间通信

multiprocessing模块支持Queues和Pipes两种方式来进行进程间通信

使用Queue

In [123]: from multiprocessing import Process,Queue

In [124]: def f(q):
   .....:     q.put([42,None,‘hello‘])
   .....:     

In [125]: if __name__ == ‘__main__‘:
   .....:     q=Queue()
   .....:     p=Process(target=f,args=(q,))
   .....:     p.start()
   .....:     print q.get()
   .....:     p.join()
   .....:     
[42, None, ‘hello‘]


使用Queues,对于线程和进程来说都是安全的



使用Pipe

In [136]: from multiprocessing import Process,Pipe

In [137]: def f(conn):
   .....:     conn.send([42,None,‘hello‘])
   .....:     conn.close()
   .....:     

In [138]: if __name__ == ‘__main__‘:
   .....:     parent_conn,child_conn=Pipe()
   .....:     p=Process(target=f,args=(child_conn,))
   .....:     p.start()
   .....:     print parent_conn.recv()
   .....:     p.join()
   .....:     
[42, None, ‘hello‘]


Pipe()返回一对连接对象,这两个连接对象分别代表Pipe的两端。每个连接对象都有send()和recv()方法。需要注意的是如果两个不同的进程在同一时间对同一个Pipe的末端或者连接对象进行读写操作,那么Pipe中的数据可能被损坏。不同的进程在不同的末端同一时间读写数据不会造成数据损坏。


3.进程间同步

In [143]: from multiprocessing import Process,Lock

In [144]: def f(l,i):
               l.acquire()
               print ‘hello world‘,i
               l.release()
   .....:     

In [145]: if __name__ == ‘__main__‘:
               lock=Lock()
               for num in range(10):
                   Process(target=f,args=(lock,num)).start()
   .....:         
hello world 0
hello world 1
hello world 2
hello world 3
hello world 4
hello world 5
hello world 6
hello world 7
hello world 8
hello world 9






参考文档:

https://docs.python.org/2/library/multiprocessing.html


本文出自 “Linux SA John” 博客,请务必保留此出处http://john88wang.blog.51cto.com/2165294/1749486

Python的multiprocessing模块学习

原文:http://john88wang.blog.51cto.com/2165294/1749486

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!