Python的多进程编程
2024-08-27 19:07:49
Python在2.6引入了多进程的机制,并提供了丰富的组件及api以方便编写并发应用。multiprocessing包的组件Process, Queue, Pipe, Lock等组件提供了与多线程类似的功能。
使用这些组件。能够方便地编写多进程并发程序。
Process
Process等同于java.lang.Thread。start方法用以启动某个进程。一个简单的演示样例:
- from multiprocessing import Process
- import os
- import time
- def sleeper(name, seconds):
- print "Process ID# %s" % (os.getpid())
- print "Parent Process ID# %s" % (os.getppid())
- print "%s will sleep for %s seconds" % (name, seconds)
- time.sleep(seconds)
- if __name__ == "__main__":
- ))
- child_proc.start()
- print "in parent process after child process start"
- print "parent process abount to join child process"
- child_proc.join()
- print "in parent process after child process join"
- 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的一段演示样例代码:
- from multiprocessing import Process, Queue
- def offer(queue):
- queue.put("Hello World")
- if __name__ == '__main__':
- q = Queue()
- p = Process(target=offer, args=(q,))
- p.start()
- 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。
- from multiprocessing import Process, Pipe
- def send(conn):
- conn.send("Hello World")
- conn.close()
- if __name__ == '__main__':
- parent_conn, child_conn = Pipe()
- p = Process(target=send, args=(child_conn,))
- p.start()
- print parent_conn.recv()
同步
multiprocessing包提供了Condition, Event, Lock, RLock, Semaphore等组件可用于同步。以下是使用Lock的一个演示样例:
- from multiprocessing import Process, Lock
- def l(lock, num):
- lock.acquire()
- print "Hello Num: %s" % (num)
- lock.release()
- if __name__ == '__main__':
- lock = Lock()
- ):
- Process(target=l, args=(lock, num)).start()
最新文章
- SQLite XXTea加密学习
- PHP面试出场率较高的题目<;转载>;
- jQuery validate 根据 asp.net MVC的验证提取简单快捷的验证方式(jquery.validate.unobtrusive.js)
- tips null和undefined的区别
- python环境搭建
- Elevator 分类: HDU 2015-06-19 21:52 13人阅读 评论(0) 收藏
- easyui 表单和自定义验证扩展和js自定义返回值
- unix 环境高级编程 读书笔记与习题解答第四篇
- 添加链接服务器 SQL SERVER
- Win8.1OS64位oracle11安装配置及PL/SQL Developer怎样连接64位oracle
- (一个)AngularJS获取贴纸Hello World
- Oulipo HDU 1686 KMP模板
- 解决ui-router路由监听$stateChangeStart、$stateChangeSuccess、$stateChangeError不执行的问题
- FormatMessage
- iOS 开发网络篇—监测网络状态
- Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
- echo不换行的实现
- HTML5文件API之FileReader
- 利用iOS中Safari浏览器创建伪Web App
- css 需要阴影的效果
热门文章
- ubuntu的boot分区报警,删除无用内核文件。
- 查看Linux系统资源占用
- 最长上升子序列:2016 Pacific Northwest Region Programming Contest—Division 2 Problem M
- luogu P1060 开心的金明
- Codeforces 610C:Harmony Analysis(构造)
- [CODE FESTIVAL 2016]Encyclopedia of Permutations
- Problem Z: 百鸡问题
- 【bugku】【RE】file WriteUp
- 异常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项
- WindowsServices_无法拷贝文件到服务器