`
bofang
  • 浏览: 126286 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

使用Python进行多进程编程

 
阅读更多



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 = 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")

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()

    for num in range(20):
        Process(target=l, args=(lock, num)).start()
  



分享到:
评论

相关推荐

    Python多进程编程.docx

    本文将从多进程概念、Python的多进程库、多进程编程的使用及注意事项方面介绍Python多进程编程技术。 一、多进程概念 多进程是一种并行计算方式,是指在一个程序中同时运行多个进程。不像线程,多进程会更安全稳定,...

    Python高级编程-Python多进程编程基础及实例讲解 共14页.pdf

    Python高级编程-Python多进程编程基础及实例讲解 共14页.pdf

    基于Python的多进程编程

    进程是自愿分配的基本单元,线程是CPU执行和调度的基本单位。进程之间的数据是独立的,同一个进程中的所有线程中的数据是共享的。...多进程编程同时运行了多个任务,并发执行的时间比单进程顺序执行要快。

    Python多线程编程

    多进程编程 一、 multiprocessing 模块 1. multiprocessing 模块提供了多进程编程的能力 它的API非常类似于 threading 模块,但是也提供了一些threading 模块不具有的能力 相比于线程,它通过派生子进程来绕过GIL 的...

    深入理解python多进程编程

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

    04-多任务-进程(python和linux高级编程阶段 代码和截图)

    04-多任务-进程(python和linux高级编程阶段 代码和截图)04-多任务-进程(python和linux高级编程阶段 代码和截图)04-多任务-进程(python和linux高级编程阶段 代码和截图)04-多任务-进程(python和linux高级编程...

    解析Python下的多进程编程_.docx

    解析Python下的多进程编程_.docx

    Python-Python3爬虫系列的理论验证比较同步依序下载多进程并发多线程并发和asyncio异步编程之间的效率差别

    Python3爬虫系列的理论验证,比较同步依序下载、多进程并发、多线程并发和asyncio异步编程之间的效率差别

    python并行编程pdf

    python并行编程pdf ,多线程技术,多进程技术,python并行编程pdf ,多线程技术,多进程技术

    第20章 Python多线程编程.pdf

    python多线程编程,适合进阶型学习者,实现多线程下的编程。

    Python多进程编程multiprocessing代码实例

    在 多线程与多进程的比较 这一篇中记录了多进程编程的一种方式. 下面记录一下多进程编程的别一种方式,即使用multiprocessing编程 import multiprocessing import time def get_html(n): time.sleep(n) print('sub...

    Python高级编程和异步IO并发编程

    python高级编程源码包含面向对象 socket 三大器 多线程 多进程 协程

    Python多进程编程技术在第三次全国国土调查县级数据库质检中的应用.pdf

    Python多进程编程技术在第三次全国国土调查县级数据库质检中的应用.pdf

    Python多进程写入同一文件的方法

    既然多线程没有什么用处,那就可以使用多进程来处理,毕竟多进程是可以不受GIL影响的。Python提供了一个multiprocessing的多进程库,但是多进程也有一些问题,比如,如果进程都需要写入同一个文件,那么就会出现多个...

    Python多线程编程.zip

    Python多线程编程.zipPython多线程编程.zipPython多线程编程.zipPython多线程编程.zipPython多线程编程.zipPython多线程编程.zipPython多线程编程.zipPython多线程编程.zipPython多线程编程.zip 运行python的时候,...

    初步解析Python下的多进程编程

    要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识。 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,...

    Python多线程和多进程编程(并发编程).rar

    当我耐心整理了一些编程资源,希望能够帮助大家学习编程技能。这些资源包括各种编程语言的教程、开发工具、实例项目和在线学习平台。通过这些资源,大家可以系统地学习编程的基础知识,掌握不同语言的语法和应用,...

    Python编程入门经典

    21.8 使用Jython进行测试 483 21.9 嵌入Jython解释器 484 21.10 处理C-Python和Jython 之间的差异 487 21.11 本章小结 488 21.12 习题 488 第Ⅳ部分 附 录 附录A 习题答案 491 附录B 在线资源 519 附录C Python 3.1...

Global site tag (gtag.js) - Google Analytics