Python的multiprocessing,Queue,Process

在多线程multiprocessing模块中,有两个类,Queue(队列)和Process(进程);

在Queue.py中也有一个Queue类,这两个Queue的区别?

from multiprocessing import Queue,Process引入multiprocessing模块中的队列和进程类

队列Queue:

Queue是python中的标准库,可以直接import引用在队列中;Queue.Queue(maxsize)创建队列对象,如果不提供maxsize,则队列数无限制。

# _*_ encoding:utf-8 _*_
import Queue

q = Queue.Queue(10)
q.put(‘SB‘)
q.put(‘You‘)
print (q.get())
print (q.get())

当一个队列为空的时候,用get取回堵塞,所以一般取队列的时候会用,get_nowait()方法,这个方法在向一个空队列取值的时候会抛一个Empty异常,所以一般会先判断队列是否为空,如果不为空则取值;

不阻塞的方式取队列

判断队列是否为空,为空返回True,不为空返回False

返回队列的长度

Queue.get([block[, timeout]]) 获取队列,timeout等待时间  
Queue.get_nowait() 相当Queue.get(False) 
非阻塞 Queue.put(item) 写入队列,timeout等待时间  
Queue.put_nowait(item) 相当Queue.put(item, False)

Multiprocessing中使用子进程的概念Process:

from multiprocessing import Process

可以通过Process来构造一个子进程

p=Process(target=fun,args=(args))

再通过p.start()来启动子进程

再通过p.join()方法来使得子进程运行结束后再执行父进程

在multiprocessing中使用pool:

如果需要多个子进程时可以考虑使用进程池(pool)来管理

Pool创建子进程的方法与Process不同,是通过p.apply_async(func,args=(args))实现,一个池子里能同时运行的任务是取决你电脑CPU的数量,如果是4个CPU,那么会有task0,task1,task2,task3同时启动,task4需要在某个进程结束后才开始。

多个子进程间的通信:

多个子进程间的通信就要采用第一步中的队列Queue,比如,有以下需求,一个子进程向队列中写数据,另一个进程从队列中取数据,

# _*_ encoding:utf-8 _*_

from multiprocessing import Process,Queue,Pool,Pipe
import os,time,random

#写数据进程执行的代码:
def write(p):
    for value in [‘A‘,‘B‘,‘C‘]:
        print (‘Write---Before Put value---Put %s to queue...‘ % value)
        p.put(value)
        print (‘Write---After Put value‘)
        time.sleep(random.random())
        print (‘Write---After sleep‘)

#读数据进程执行的代码:
def read(p):
    while True:
        print (‘Read---Before get value‘)
        value = p.get(True)
        print (‘Read---After get value---Get %s from queue.‘ % value)

if __name__ == ‘__main__‘:
    #父进程创建Queue,并传给各个子进程:
    p = Queue()
    pw = Process(target=write,args=(p,))
    pr = Process(target=read,args=(p,))
    #启动子进程pw,写入:
    pw.start()
    #启动子进程pr,读取:
    pr.start()
    #等待pw结束:
    pw.join()
    #pr进程里是死循环,无法等待其结束,只能强行终止:
    pr.terminate()

关于锁的应用,在不同程序间如果有同时对同一个队列操作的时候,为了避免错误,可以在某个函数操作队列的时候给它加把锁,这样在同一个时间内则只能有一个子进程对队列进行操作,锁也要在manager对象中的锁

时间: 2024-10-27 17:47:42

Python的multiprocessing,Queue,Process的相关文章

python中的Queue与多进程(multiprocessing)

最近接触一个项目,要在多个虚拟机中运行任务,参考别人之前项目的代码,采用了多进程来处理,于是上网查了查python中的多进程 一.先说说Queue(队列对象) Queue是python中的标准库,可以直接import 引用,之前学习的时候有听过著名的"先吃先拉"与"后吃先吐",其实就是这里说的队列,队列的构造的时候可以定义它的容量,别吃撑了,吃多了,就会报错,构造的时候不写或者写个小于1的数则表示无限多 import Queue q = Queue.Queue(10

python多进程multiprocessing模块中Queue的妙用

最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个process.Multiprocessing的使用确实能显著提升爬虫速度,不过程序交由用户使用时,缺乏一个好的GUI窗口来显示爬虫进度.之前的文章中使用了Chrome浏览器来渲染js脚本生成了进度条.但是鉴于Chrome在运行时十分吃内存资源,用Chrome只是生成一个进度条难免有些“大材小用”,所以,小

练习--python中的Queue与多进程(multiprocessing)

按官方说法: This module is OBSOLETE and is only provided on PyPI to support old projects that still use it. Please DO NOT USE IT FOR NEW PROJECTS! Use modern alternatives like the multiprocessing module in the standard library or even an asynchroneous app

python的multiprocessing模块进程创建、资源回收-Process,Pool

python的multiprocessing有两种创建进程的方式,每种创建方式和进程资源的回收都不太相同,下面分别针对Process,Pool及系统自带的fork三种进程分析. 1.方式一:fork() 举例: 1 import os 2 pid = os.fork() # 创建一个子进程 3 os.wait() # 等待子进程结束释放资源 4 pid为0的代表子进程. 缺点:1.兼容性差,只能在类linux系统下使用,windows系统不可使用:2.扩展性差,当需要多条进程的时候,进程管理变得

python多进程——multiprocessing.Process

简介 multiprocessing是一个使用类似于threading模块的API支持生成进程的包.该multiprocessing软件包提供本地和远程并发.因此,该multiprocessing模块允许程序员充分利用给定机器上的多个处理器.可以在Unix和Windows上运行. multipleprocessing文档 Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None) 应该始终使用关键

python多进程-----multiprocessing包

multiprocessing并非是python的一个模块,而是python中多进程管理的一个包,在学习的时候可以与threading这个模块作类比,正如我们在上一篇转载的文章中所提,python的多线程并不能做到真正的并行处理,只能完成相对的并发处理,那么我们需要的就是python的多进程来完成并行处理,把所有的cpu资源都利用起来.multiprocessing的很大一部分与threading使用同一套API,只不过换到了多进程的环境.这里面要注意,对于多进程来说,win32平台和unix平

Python多进程multiprocessing使用示例

mutilprocess简介 像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多. import multiprocessing def worker(num): """thread worker function""" print 'Worker:', num return if __name__ == '__main__': jobs = [] for i

python 学习笔记 - Queue & Pipes,进程间通讯

上面写了Python如何创建多个进程,但是前面文章中创建的进程都是哑巴和聋子,自己顾自己执行,不会相互交流.那么如何让进程间相互说说话呢?Python为我们提供了一个函数multiprocessing.Pipe和一个类:multiprocessing.Queue. multiprocessing.Pipe() multiprocessing.Pipe()即管道模式,调用Pipe()返回管道的两端的Connection. Python官方文档的描述: Returns a pair (conn1,

python中multiprocessing模块

multiprocess模块那来干嘛的? 答:利用multiprocessing可以在主进程中创建子进程. #该模块和Threading模块使用方法基本类似. 首先需要说明,你所使用多线程的函数不能有return,比如你要将job这个函数多线程那么在job这个函数里就不能有return,如果有返回值请看文章的最后. multiprocessing最好写在if __name__ == '__main__'当中,如果不放在这里面,windows可能会出错.其余环境则不会出现这种情况.我第一个案例没有