本文以实例形式分析了Python多进程编程技术,有助于进一步Python程序设计技巧。分享给大家供大家参考。具体分析如下:
一般来说,由于Python的线程有些限制,例如多线程不能充分利用多核CPU等问题,因此在Python中我们更倾向使用多进程。但在做不阻塞的异步UI等场景,我们也会使用多线程。本篇文章主要探讨Python多进程的问题。
Python在2.6引入了多进程的机制,并提供了丰富的组件及api以方便编写并发应用。multiprocessing包的组件Process, Queue, Pipe, Lock等组件提供了与多线程类似的功能。使用这些组件,可以方便地编写多进程并发程序。
Process
Process的使用有点像java.lang.Thread,但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 = 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的一段示例代码:
from multiprocessing import Process, Queue def offer(queue): queue.put("Hello World") def test(queue, num): queue.put("Hello World: " + str(num)) if __name__ == '__main__': q = Queue() p1 = Process(target=test, args=(q, 1)) p1.start() p = Process(target=offer, args=(q,)) p.start() p2 = Process(target=test, args=(q, 2)) p2.start() p2 = Process(target=test, args=(q, 3)) p2.start() print q.get() print q.get() print q.get() print q.get() print q.close()
输出:
Hello World: 1
Hello World
Hello World: 2
None
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() for num in range(20): Process(target=l, args=(lock, num)).start()
总结
以上是Python multiprocessing库的简单介绍和实例,熟悉Java多线程开发的同学是不是觉得很熟悉,和java的Concurrency API很像,不过javaConcurrency是处理多线程的而已,我们可以直接按照以前Java多线程的经验用这些API。
感兴趣的朋友可以测试运行本文实例以加深理解。相信本文所述对大家Python程序设计的学习有一定的借鉴价值。
本文向大家介绍Python多进程编程multiprocessing代码实例,包括了Python多进程编程multiprocessing代码实例的使用技巧和注意事项,需要的朋友参考一下 在 多线程与多进程的比较 这一篇中记录了多进程编程的一种方式. 下面记录一下多进程编程的别一种方式,即使用multiprocessing编程 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教
本文向大家介绍PHP多进程编程实例,包括了PHP多进程编程实例的使用技巧和注意事项,需要的朋友参考一下 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进程太慢,那么,试试用多进程来搞吧。这篇文章将会介绍一下PHP多进程的基本需求,如何创建多进程以及基本的信号控制,暂时不会告诉你如何进行进程间通信和信息共享。 1. 准备 在动手之前,请确定你用的不是M$ W
本文向大家介绍Python多进程multiprocessing用法实例分析,包括了Python多进程multiprocessing用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python多进程multiprocessing用法。分享给大家供大家参考,具体如下: mutilprocess简介 像线程一样管理进程,这个是mutilprocess的核心,他与threading很是
本文向大家介绍PHP多进程编程实例详解,包括了PHP多进程编程实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP多进程编程。分享给大家供大家参考,具体如下: 第一步: $ php -m 命令查看php是否安装pcntl 和 posix扩展,若没有则安装 使用场景: 1. 要进行大量的网络耗时的操作 2. 要做大量的运算,并且,系统有多个cpu,为了让用户有更快的体验,把一个任
本文向大家介绍python多进程操作实例,包括了python多进程操作实例的使用技巧和注意事项,需要的朋友参考一下 由于CPython实现中的GIL的限制,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况我们需要使用多进程。 这也许就是python中多进程类库如此简洁好用的原因所在。在python中可以向多线程一样简单地使用多进程。 一、
本文向大家介绍Python多线程多进程实例对比解析,包括了Python多线程多进程实例对比解析的使用技巧和注意事项,需要的朋友参考一下 多线程适合于多io操作 多进程适合于耗cpu(计算)的操作 可以看到在耗cpu的应用中,多进程明显优于多线程 2.6130592823028564 < 3.905290126800537 下面模拟一个io操作 可以看到 8.00358772277832 < 8.1