使用这些组件。能够方便地编写多进程并发程序。
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. printPipes
假设没有消息可接收,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()
















