学习笔记16
分类:计算机编程

1.队列(queue)

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

1.创建进程组 process = []

用法:

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

2.创建进程 t1 = multiprocessing.Process(target = 函数 , args = ('参数',lock))只有一个参数时,参数后面要有“,”号,不然'music'会识别为传了5个参数

import queue
q = queue.Queue()    #先进先出模式
q.put(1)                    #存放数据在q里

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

3.装载线程 process.append(t1)

 

图片 1

4.遍历线程组

作用: 1)解耦
     2)提高效率

图片 2

for t in threads:

class queue.Queue(maxsize=0)                        #先入先出
class queue.LifoQueue(maxsize=0)                  #后进先出
class queue.PriorityQueue(maxsize=0)             #存储数据时可设置优先级的队列

 

t.start()

Queue.qsize()                                                    #   返回队列的大小
Queue.empty()                                                   # 如果队列为空,返回True,反之False
Queue.full()                                                        #如果队列满了,返回True,反之
Queue.get([block[, timeout]])                              # 获取队列,timeout等待时间
Queue.get_nowait()                                             #相当Queue.get(False)
Queue.put(item)                                                    #写入队列,timeout等待时间( 非阻塞)
Queue.put_nowait(item)                                      # 相当Queue.put(item, False)
Queue.task_done()                                              #在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
Queue.join()                                                           #实际上意味着等到队列为空,再执行别的操作

 队列Queue:

t.join()  //用于等待守护进程终止,也就是说必须等到for循环里的两个进程都结束后才去执行主进程

 

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

终止进程使用poison pill,强制的使用terminate(),注意在terminate之后要join,使其可以更新状态

2.python多线程不适合cpu密集操作型的任务,适合io操作密集型的任务

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

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

如果所有的任务都向同一个标准输出输出,需要使用Lock同步,在一个任务输出完成之后,再允许另一个任务的输出

 

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

lock=multiprocessing.Lock()

 

不阻塞的方式取队列

lock.acquire()

3.multiprocessing模块 

图片 3

多个任务同时涉及的操作

官方详解:

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

lock.release()

1).pipe(管道)                             

图片 4

提供了thread没有的Pipe和Queue

multiprocessing.Pipe()即管道模式,调用Pipe()返回管道的两端的Connection。

返回队列的长度

1.Pipe可以是单向的(只允许一端输入),也可以是双向的(允许两端输入),默认是双向的。pipe=multiprocessing.Pipe(duplex=False)创建单向管道

2).manager
multiprocessing.manager()
用于多进程之间信息的共享

 图片 5

pipe[0].send('hello')

3).Pool(进程池)
multiprocessing.Pool()
  1)进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,如果进程池序列中没有可供使用的进进程,那么程序就会等待,直到进程池中有可用进程为止。

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

pipe[1].recv()

  2)在windos上必须写上if __name__=='__main__':之后才生成进程池才不会出错进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。

 

Pipe对象建立的时候,返回一个含有两个元素的表,每个元素代表Pipe的一端。对一端调用send()方法来传递对象,另一端使用recv()来接收

  3)进程池两个方法
    apply() 穿行
    apply_async() 并行
    注:pool.apply_async(func=Foo, args=(i,), callback=Bar)#callback回调Bar

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

2.Queue允许多个进程放入,多个进程从队列取出对象,先进先出queue=multiprocessing.Queue(maxsize),maxsize表示队列中可以存放对象的最大数量

 

from multiprocessing import Process

queue.put(info)

6.if __name__=='__main__':
_name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。

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

queue.get()

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

不再输入到队列时可以关闭队列,queue.close()

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

进程池

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

声明进程池大小:pool = multiprocessing.Pool(processes = 3)

 

加入进程池:pool.apply_async(func[, args[, kwds[, callback]]]) --非阻塞的

在multiprocessing中使用pool:

pool.apply(func[, args[, kwds]]) --阻塞的,#维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去

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

关闭进程池:pool.close()

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

等待进程运行完毕,调用之前一定要先关闭进程池:pool.join()

 

多个子进程间的通信:

多个子进程间的通信就要采用第一步中的队列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对象中的锁

 

本文由pc28.am发布于计算机编程,转载请注明出处:学习笔记16

上一篇:Expression经验之前言,深入理解C 下一篇:没有了
猜你喜欢
热门排行
精彩图文
  • Pycharm的安装和使用,Adelaide装修网深入分析厨房
    Pycharm的安装和使用,Adelaide装修网深入分析厨房
      MapServer linux上服务安装 关于厨房中水管的安装常见的就是下水管的安装,对于下水管的安装可能很多人都不知道该如何安装,青岛装修网资深装修达人说
  • 电子商务货品库的成品设计,PHP数组内容不重复
    电子商务货品库的成品设计,PHP数组内容不重复
    多年来在做ecshop的货物仓库储存模块,分别给黄金年代款商品的两性情格组合设置仓库储存,如下图: # 手艺文书档案 每一天逛天猫和京东的时候,映着重
  • 九彩拼盘的前端技能,LayUI框架的应用
    九彩拼盘的前端技能,LayUI框架的应用
    内容: HTML 普及标签和总体性 文书档案类型申明 转义字符 网页访问无障碍(只是掌握卡塔 尔(阿拉伯语:قطر‎ CSS 常用采取器 体制生效准绳(浏览器的
  • 编制程序总计,动态目的
    编制程序总计,动态目的
    dynamic是FrameWork4.0的新特色。dynamic的现身让C#具备了弱语言类型的风味。编写翻译器在编写翻译的时候不再对项目举行检查,编译期暗中同意dynamic对象扶植
  • 动态编写翻译,在线运转
    动态编写翻译,在线运转
    千帆竞发产生c#代码的在线编辑。     在帮顾客写JAVA客商端访谈.NET达成的Webservice的示范代码发掘了一个有意思的标题。为有保持安全性,使用了wse2.0sp