使用这些组件。能够方便地编写多进程并发程序。


Process


Process等同于java.lang.Thread。start方法用以启动某个进程。一个简单的演示样例:


Python代码  

1. from multiprocessing import
2. import
3. import
4.   
5. def
6. print "Process ID# %s"
7. print "Parent Process ID# %s"
8. print "%s will sleep for %s seconds"
9.     time.sleep(seconds)  
10.   
11. if __name__ == "__main__":  
12. 'bob', 5))  
13.     child_proc.start()  
14. print "in parent process after child process start"
15. print "parent process abount to join child process"
16.     child_proc.join()  
17. print "in parent process after child process join"
18. print "the parent's parent process: %s"

target是新的进程的入口方法,能够觉得是main方法。args是该方法的參数列表。启动进程类似于启动Thread,必需要调用start方法。

也能够继承Process,覆盖run方法,在run方法中实现该进程的逻辑。调用join方法会堵塞当前调用进程。直到被调用进程执行结束。


须要注意的是。exit处理逻辑并不会被运行,该进程的子进程不会被终止,他们仅仅会变成孤儿进程。


Queue


put方法用以插入数据到队列中,put方法还有两个可选參数:blocked和timeout。假设blocked为True(默认值),而且timeout为正值,该方法会堵塞timeout指定的时间,直到该队列有剩余的空间。假设超时,会抛出Queue.Full异常。

假设blocked为False,但该Queue已满。会马上抛出Queue.Full异常。


相同,get方法有两个可选參数:blocked和timeout。假设blocked为True(默认值),而且timeout为正值。那么在等待时间内没有取到不论什么元素,会抛出Queue.Empty异常。假设blocked为False,有两种情况存在,假设Queue有一个值可用,则马上返回该值。否则,假设队列为空,则马上抛出Queue.Empty异常。Queue的一段演示样例代码:


Python代码  

1. from multiprocessing import
2.   
3. def
4. "Hello World")  
5.   
6. if __name__ == '__main__':  
7.     q = Queue()  
8.     p = Process(target=offer, args=(q,))  
9.     p.start()  
10. print

Pipes



假设没有消息可接收,recv方法会一直堵塞。假设管道已经被关闭,那么recv方法会抛出EOFError。


Python代码  

1. from multiprocessing import
2.   
3. def
4. "Hello World")  
5.     conn.close()  
6.   
7. if __name__ == '__main__':  
8.     parent_conn, child_conn = Pipe()  
9.     p = Process(target=send, args=(child_conn,))  
10.     p.start()  
11. print

 

同步


multiprocessing包提供了Condition, Event, Lock, RLock, Semaphore等组件可用于同步。以下是使用Lock的一个演示样例:


Python代码  


1. from multiprocessing import
2.   
3. def
4.     lock.acquire()  
5. print "Hello Num: %s"
6.     lock.release()  
7.   
8. if __name__ == '__main__':  
9.     lock = Lock()  
10.   
11. for num in range(20):  
12.         Process(target=l, args=(lock, num)).start()