使用Python进行多进程编程
2016-04-26 09:54
736 查看
Python在2.6引入了多进程的机制,并提供了丰富的组件及api以方便编写并发应用。multiprocessing包的组件Process,Queue, Pipe, Lock等组件提供了与多线程类似的功能。使用这些组件,可以方便地编写多进程并发程序。
Process
Process等同于java.lang.Thread。start方法用以启动某个进程。一个简单的示例:
Python代码
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 = Process(target=sleeper, args=('bob', 5))
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的一
段示例代码:
Python代码
![](file:///C:\Users\moses.mo\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png)
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。
Python代码
![](file:///C:\Users\moses.mo\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png)
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的一个示例:
Python代码
from multiprocessing import Process, Lock
def l(lock, num):
lock.acquire()
print "Hello Num: %s" % (num)
lock.release()
if __name__ == '__main__':
lock = Lock()
for num in range(20):
Process(target=l, args=(lock, num)).start()
Process
Process等同于java.lang.Thread。start方法用以启动某个进程。一个简单的示例:
Python代码
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 = Process(target=sleeper, args=('bob', 5))
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的一
段示例代码:
Python代码
![](file:///C:\Users\moses.mo\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png)
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。
Python代码
![](file:///C:\Users\moses.mo\AppData\Local\Temp\msohtmlclip1\01\clip_image001.png)
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的一个示例:
Python代码
from multiprocessing import Process, Lock
def l(lock, num):
lock.acquire()
print "Hello Num: %s" % (num)
lock.release()
if __name__ == '__main__':
lock = Lock()
for num in range(20):
Process(target=l, args=(lock, num)).start()
相关文章推荐
- Python系列(一)转义字符
- Python多进程并发(multiprocessing)
- Python多线程学习
- Python 字符串操作
- python类型转换、数值操作
- [Interactive Python] Rock-paper-scissors-lizard-Spock 游戏 Mini-project #1
- Selenium2 Python 自动化测试实战学习笔记(九)
- python 中列表的sort方法
- RSA算法Python实现
- Python爬虫 Selenium实现自动登录163邮箱和Locating Elements介绍
- Python debug —— 逻辑错误 (二)
- python 正则使用笔记
- 在注册表中无Python3.5安装路径的情况下安装pywin32-
- Python基础
- Python抓取有道翻译,得到在线翻译结果
- Python 3.4 printf的用法
- Mac 随机启动Python脚本服务
- Python入门简单的静态网页爬虫2.0 (实现各模块的具体方法)
- 1.3Python快速入门
- 1.4Python环境准备