multiprocessing在python中的高级应用-共享数据与同步

通常,进程之间彼此是完全孤立的,唯一的通信方式是队列或管道。但可以使用两个对象来表示共享数据。其实,这些对象使用了共享内存(通过mmap模块)使访问多个进程成为可能。

Value( typecode, arg1, … argN, lock )

在共享内容中常见ctypes对象。typecode要么是包含array模块使用的相同类型代码(如’i’,’d’等)的字符串,要么是来自ctypes模块的类型对象(如ctypes.c_int、ctypes.c_double等)。所有额外的位置参数arg1, arg2 ….. argN将传递给指定类型的构造函数。lock是只能使用关键字调用的参数,如果把它置为True(默认值),将创建一个新的锁定来包含对值的访问。如果传入一个现有锁定,比如Lock或RLock实例,该锁定将用于进行同步。如果v是Value创建的共享值的实例,便可使用v.value访问底层的值。例如,读取v.value将获取值,而赋值v.value将修改值。

RawValue( typecode, arg1, … ,argN)

同Value对象,但不存在锁定。

Array( typecode, initializer, lock )

在共享内存中创建ctypes数组。typecode描述了数组的内容,意义与Value()函数中的相同。initializer要么是设置数组初始大小的整数,要么是项目序列,其值和大小用于初始化数组。lock是只能使用关键字调用的参数,意义与Value()函数中相同。如果a是Array创建的共享数组的实例,便可使用标准的python索引、切片和迭代操作访问它的内容,其中每种操作均由锁定进行同步。对于字节字符串,a还具有a.value属性,可以吧整个数组当做一个字符串进行访问。

RawArray(typecode, initializer )

同Array对象,但不存在锁定。当所编写的程序必须一次性操作大量的数组项时,如果同时使用这种数据类型和用于同步的单独锁定(如果需要的话),性能将得到极大的提升。

除了使用Value()和Array()创建的共享值之外,multiprocessing模块还提供一下同步源于的共享版本。

![这里写图片描述](http://img.blog.csdn.net/20150830164730833)

这些对象的行为与threading模块中定义的名称相同的同步原语相似。请参考threading文档了解更多细节。

应该注意,使用多进程后,通常不必再担心与锁定、信号量或类似构造的底层同步,这一点与线程不相伯仲。在某种程度上,管道上的send()和receive()操作,以及队列上的put()和get()操作已经提供了同步功能。但是,在某写特定的设置下还是需要用到共享值和锁定。下面这个例子说明了如何使用共享数组代替管道,将一个浮点数的python列表发送给另一个进程:

import multiprocessing
class FloatChannel(object):
    def __init__(self,maxsize):
        self.buffer=multiprocessing.RawArray(‘d‘,maxsize)
        self.buffer_len=multiprocessing.Value(‘i‘)
        self.empty=multiprocessing.Semaphore(1)
        self.full=multiprocessing.Semaphore(0)
    def send(self,values):
        self.empty.acquire()  #只在缓存为空时继续
        nitems=len(values)
        self.buffer_len=nitems  #设置缓冲区大小
        self.buffer[:nitems]=values #将复制到缓冲区中
        self.full.release() #发信号通知缓冲区已满
    def recv(self):
        self.full.acquire()     #只在缓冲区已满时继续
        values=self.buffer[:self.buffer_len.value]  #复制值
        self.empty.release()        #发送信号通知缓冲区为空
        return values
    #性能测试 接收多条消息
def consume_test(count,ch):
    for i in xrange(count):
        values=ch.recv()

#性能测试 发送多条消息
def produce_test(count,values,ch):
    for i in xrange(count):
        ch.send(values)
if __name__=="__main__":
    ch=FloatChannel(100000)
    p=multiprocessing.Process(target=consume_test,args=(1000,ch))
    p.start()
    values=[float(x) for x in xrange(100000)]
    produce_test(1000,values,ch)
    print "Done"
    p.join()

在我的计算机上执行性能测试时,通过FloatChannel发送一个较大的浮点数列表,速度比通过Pipe发送快大约80%,因为后者必须对所有值进行序列化和反序列化。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 00:16:59

multiprocessing在python中的高级应用-共享数据与同步的相关文章

multiprocessing在python中的高级应用-IPC 之 Queue

multiprocessing模块支持进程间通信的两种主要形式:管道和队列.这两种方法都使用了消息传递实现的,但队列接口有意模仿线程程序中常见的队列用法. 有关Queue编程实例可以查看微博内容. Queue([maxsize]) 创建共享的进程队列.maxsize是队列中允许的最大项数.如果省略此参数,则无大小限制.底层队列使用管道和锁定实现.另外,还需要运行支持线程以便队列中的数据传输到底层管道中. Queue的实例q具有以下方法: q.cancel_join_thread() 不会再进程退

multiprocessing在python中的高级应用-进程池

下面的类可以创建进程池,可以吧各种数据处理任务都提交给进程池.进程池提供的功能有点类似于列表解析和功能性编程操作(如映射-规约)提供的功能. Pool( [ numprocess [, initializer [, initargs] ] ] ) 创建工作进程池. numprocess是要创建的进程数.如果省略此参数,将使用cpu_count()的值.[这里简单介绍一下: from multiprocessing import cpu_count print(cpu_count()) #获得电脑

multiprocessing在python中的高级应用-进程

本篇主要讲解multiprocessing中的重要模块-进程. Process([group [,target [,name [,args [,kwargs]]]]]) 这个类表示运行在一个子进程中的任务,应该使用关键字参数来指定构造函数中的参数.target是当前进程启动时执行的可调用对象,args是传递给target的位置参数的元组,而kwargs是传递给target的关键字参数的字典.如果省略args和kwargs参数,将不带参数调用target.name是为进程指定描述性名称额字符串.g

multiprocessing在python中的高级应用-IPC 之 Pipe

作为使用队列的另一种形式,还可以使用管道在进程回见执行消息传递. Pipe( [ duplex]) 在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn1和conn2是表示管道两端的Connection对象.默认情况下,管道是双向的.如果将duplex置为False,conn1只能用于接收,而conn2只能用于发送.必须在创建和启动使用管道的Process对象之前调用Pipe()方法. Pipe()方法返回的Connection对象的实例c具有以下方法和属性. c.clos

Python中的高级数据结构(转)

add by zhj: Python中的高级数据结构 数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据 结构,分别是List.Tuple.Dictionary以及Set.大部分的应用程序不需要其他类型的数据结构,但若是真需要也有很多高级数据结构可供 选择,例如Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint.本文将介绍这些数据结构的用法,看 看它

Python中的高级数据结构详解

这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考下 数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据结构,分别是List.Tuple.Dictionary以及Set.大部分的应用程序不需要其他类型的数据结构,但若是真需要也有很多高级数据结构可供选择

JAVA笔记14__多线程共享数据(同步)/ 线程死锁 /

/** * 多线程共享数据 * 线程同步:多个线程在同一个时间段只能有一个线程执行其指定代码,其他线程要等待此线程完成之后才可以继续执行. * 多线程共享数据的安全问题,使用同步解决. * 线程同步两种方法: * 1.同步代码块 * synchronized(要同步的对象){ 要同步的操作 } * 2.同步方法 * public synchronized void method(){ 要同步的操作 } */ public class Main { public static void main(

Python中的高级数据结构

数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据结构,分别是List.Tuple.Dictionary以及Set.大部分的应用程序不需要其他类型的数据结构,但若是真需要也有很多高级数据结构可供选择,例如Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint.本文将介绍这些数据结构的用法,看看它们是如何帮助我们的应用程序的. 关于四种内建数据结构的使用方

XPath在python中的高级应用

XPath在python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但XPath明显比re具有优势,在网页分析上使re退居二线. XPath介绍: 是什么? 全称为XML Path Language 一种小型的查询语言 说道XPath是门语言,不得不说它所具备的优点: 1) 可在XML中查找信息 2) 支持HTML的查找 3) 通过元素和属性进行导航 python开发使用XPath条件: 由于XPath属于lxml库模块,所以首先要安装库lx