Python在2.6引入了多进程的机制,并提供了丰富的组件及api以方便编写并发应用。multiprocessing包的组件Process, Queue, Pipe, Lock等组件提供了与多线程类似的功能。

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


Process

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

  1. from multiprocessing import Process
  2. import os
  3. import time
  4. def sleeper(name, seconds):
  5. print "Process ID# %s" % (os.getpid())
  6. print "Parent Process ID# %s" % (os.getppid())
  7. print "%s will sleep for %s seconds" % (name, seconds)
  8. time.sleep(seconds)
  9. if __name__ == "__main__":
  10. ))
  11. child_proc.start()
  12. print "in parent process after child process start"
  13. print "parent process abount to join child process"
  14. child_proc.join()
  15. print "in parent process after child process join"
  16. print "the parent's parent process: %s" % (os.getppid())
实例化一个Process必需要指定target和args。

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

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


手工终止一个进程能够调用terminate方法,在UNIX系统中。该方法会发送SIGTERM信号量,而在windows系统中,会借助TerminateProcess方法。

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


Queue

Queue是多进程安全的队列,能够使用Queue实现多进程之间的数据传递。

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

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


get方法能够从队列读取而且删除一个元素。

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


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

Pipe方法返回(conn1, conn2)代表一个管道的两个端。Pipe方法有duplex參数。假设duplex參数为True(默认值),那么这个管道是全双工模式,也就是说conn1和conn2均可收发。duplex为False,conn1仅仅负责接受消息,conn2仅仅负责发送消息。


send和recv方法各自是发送和接受消息的方法。比如。在全双工模式下,能够调用conn1.send发送消息,conn1.recv接收消息。

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


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

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

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

Python的多进程编程的更多相关文章

  1. Python多进程编程

    转自:Python多进程编程 阅读目录 1. Process 2. Lock 3. Semaphore 4. Event 5. Queue 6. Pipe 7. Pool 序. multiproces ...

  2. 【转】Python多进程编程

    [转]Python多进程编程 序. multiprocessingpython中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Pytho ...

  3. python中的多线程和多进程编程

    注意:多线程和多线程编程是不同的!!! 第一点:一个进程相当于一个要执行的程序,它会开启一个主线程,多线程的话就会再开启多个子线程:而多进程的话就是一个进程同时在多个核上进行: 第二点:多线程是一种并 ...

  4. Python 多进程编程之 进程间的通信(在Pool中Queue)

    Python 多进程编程之 进程间的通信(在Pool中Queue) 1,在进程池中进程间的通信,原理与普通进程之间一样,只是引用的方法不同,python对进程池通信有专用的方法 在Manager()中 ...

  5. Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...

  6. python 使用多进程实现并发编程/使用queue进行进程间数据交换

    import time import os import multiprocessing from multiprocessing import Queue, pool ""&qu ...

  7. 深入理解python多进程编程

    1.python多进程编程背景 python中的多进程最大的好处就是充分利用多核cpu的资源,不像python中的多线程,受制于GIL的限制,从而只能进行cpu分配,在python的多进程中,适合于所 ...

  8. python使用multiprocessing进行多进程编程(1)

    multiprocessing模块实现了对多进程编程的封装,让我们可以非常方便的使用多进程进行编程.它的使用方法非常类似threading模块. 1.创建一个进程 import multiproces ...

  9. Python 3 并发编程多进程之进程同步(锁)

    Python 3 并发编程多进程之进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理. 1. ...

随机推荐

  1. 在Spring Controller中将数据缓存到session

    Servlet方案 在Controller的方法的参数列表中,添加一个javax.servlet.http.HttpSession类型的形参.spring mvc会 自动把当前session对象注入这 ...

  2. SCU - 4441 Necklace(树状数组求最长上升子数列)

    Necklace frog has \(n\) gems arranged in a cycle, whose beautifulness are \(a_1, a_2, \dots, a_n\). ...

  3. BZOJ 4025 二分图(时间树+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4025 [题目大意] 给出一张图,有些边只存在一段时间,问在一个每个时间段, 这张图是否 ...

  4. SPOJ Time Limit Exceeded(高维前缀和)

    [题目链接] http://www.spoj.com/problems/TLE/en/ [题目大意] 给出n个数字c,求非负整数序列a,满足a<2^m 并且有a[i]&a[i+1]=0, ...

  5. BZOJ 2697 特技飞行(贪心)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2697 [题目大意] 神犇航空开展了一项载客特技飞行业务. 每次飞行长N个单位时间,每个 ...

  6. 【计算几何】【分类讨论】Gym - 101173C - Convex Contour

    注意等边三角形的上顶点是卡不到边界上的. 于是整个凸包分成三部分:左边的连续的三角形.中间的.右边的连续的三角形. 套个计算几何板子求个三角形顶点到圆的切线.三角形顶点到正方形左上角距离啥的就行了,分 ...

  7. Problem D: 零起点学算法94——输出矩阵

    #include<stdio.h> int main() { ][]; while(scanf("%d %d",&n,&m)!=EOF) { ; ;i& ...

  8. #iOS问题记录# UIWebView滑动到底部

    最近看Tmall的iOS APP,在Tmall的商品简介页面,当拖动到最底部时,会提示继续向上拖动,“查看图文详情”: 觉得这个设计挺好的.闲来无事,自己UIWebView模仿一下,问题是检查UIWe ...

  9. C# 高德地图调用帮助类 GaodeHelper

    /// <summary> /// 高德地图调用帮助类 /// 更多详情请参考 高德api /// </summary> public class GaodeHelper { ...

  10. Composer与laravel安装

    首先,要知道Composer是什么? Composer是PHP中用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer会帮你 ...