来自http://www.langzi.fun/Python%20multiprocess%20%E5%A4%9A%E8%BF%9B%E7%A8%8B%E6%A8%A1%E5%9D%97.html 需要注意的是,如果使用多进程,调用方法一定要加上 (Python中的multiprocess提供了Process类,实现进程相关的功能。但是它基于fork机制,因此不被windows平台支持。想要在windows中运行,必须使用该的方式),但是我有另一种方法在使用线程池的时候可以不使用name_mian,最下面说。 并且多线程就是开启多个线程,每个线程之间是不会互相通信互相干扰的,适用于密集计算。 案例一 基础用法 多进程的使用方法和多线程使用方法基本一样,所以如果你会多线程用法多进程也就懂了,有一点要注意,定义多进程,然后传递参数的时候,如果是有一个参数就是用args=(i,)一定要加上逗号,如果有两个或者以上的参数就不用这样。 运行结果: 案例二 数据通信 ipc:就是进程间的通信模式,常用的一半是socke,rpc,pipe和消息队列等。 multiprocessing提供了threading包中没有的IPC(比如Pipe和Queue),效率上更高。应优先考虑Pipe和Queue,避免使用Lock/Event/Semaphore/Condition等同步方式 (因为它们占据的不是用户进程的资源)。 使用Array共享数据 对于Array数组类,括号内的“i”表示它内部的元素全部是int类型,而不是指字符“i”,数组内的元素可以预先指定,也可以只指定数组的长度。Array类在实例化的时候必须指定数组的数据类型和数组的大小,类似temp = Array(‘i’, 5)。对于数据类型有下面的对应关系: 代码实例: 运行结果: 使用Manager共享数据 通过Manager类也可以实现进程间数据的共享,主要用于线程池之间通信,Manager()返回的manager对象提供一个服务进程,使得其他进程可以通过代理的方式操作Python对象。manager对象支持 list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value ,Array等多种格式。 代码实例: 使用queues的Queue类共享数据 multiprocessing是一个包,它内部有一个queues模块,提供了一个Queue队列类,可以实现进程间的数据共享,如下例所示: 运行结果: 例如来跑多进程对一批IP列表进行运算,运算后的结果都存到Queue队列里面,这个就必须使用multiprocessing提供的Queue来实现
Recent Comments