1、multiprocessing模块简介——进程基于“threading”的接口编程
multiprocessing模块支持建立进程——使用threading模块类似的API。multiprocessing模块对本地和远程的并发都提供了支持,使用子进程(subprocesses)来替代threads解决了GIL的限制。所以,multiprocessing模块容许程序充分利用给定设备的多核资源。在Unix和Windows系统均可以运行。安全
multiprocessing模块一样引入了threading模块不支持的APIs。主要例子如:Pool对象提供了便捷并行执行(有多输入)的函数的执行,经过进程分发输入数据。下面就是一个简单的数据分发。多线程
from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': p = Pool(5) print(p.map(f, [1, 2, 3]))
2、Process类并发
在multiprocessing模块中,processes能够经过建立一个Process对象产生。而后调用其start()方法。Process和threading.Thread遵循threading.Thread的API。一个简单的多线程例子以下ide
from multiprocessing import Process def f(name): print 'hello', name if __name__ == '__main__': p = Process(target=f, args=('bob',)) p.start() p.join()
显示相应的单个进程IDs,以下:函数
from multiprocessing import Process import os import time 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): time.sleep(2) info('function f') print('hello', name) if __name__ == '__main__': info('main line') p = Process(target=f,args=('bob',)) p.start() p.join()
3、Exchanging objects between processes进程间通信ui
一、Queue基本上是Queue.Queue的克隆版,可是本Queue是线程和进程都安全的spa
from multiprocessing import Process, Queue import time def f(q): time.sleep(2) q.put([42, None, 'hello']) print('f') if __name__ == '__main__': q = Queue() p = Process(target=f, args=(q,)) p.start() p.join() print('hello') print(q.get())
二、Pipes是Pipe()函数返回一个链接对象对——由一个pipe链接,默认是双工(两种方式)线程
from multiprocessing import Process, Pipe def f(conn): conn.send([42, None, 'hello']) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() p = Process(target=f, args=(child_conn,)) p.start() print(parent_conn.recv()) p.join()
Pipe()返回两个链接(Connection)对象,表明管道的两端。每一个链接对象都有send()和recv()方法(彼此之间)。code
注意:若是两个线程(或进程)同时尝试从pipe的同一端读写数据,管道里的数据可能损坏。若是同时在pipe()的两端读写是没有风险的。
4、进程间的同步机制
multiprocessing拥有threading模块相同的同步机制。例如,能够使用lock来保证一次只有一个进程打印到标准输出。
from multiprocessing import Process,Lock import time def f(l, i): l.acquire() # time.sleep(2) print('hello world', i) l.release() if __name__ == '__main__': lock = Lock() for num in range(10): Process(target=f,args=(lock, num)).start()
5、进程间共享状态
如上所述,咱们在作并发编程时,应当尽量避免使用共享状态。有其是多进程。然而,你非得在多进程使用共享数据,multiprocessing提供了几种方来实现。
一、Shared memory共享内存
数据能够存储在共享内存里使用Value或Array。例如,以下代码: