进程队列介绍

1  基本语法及过程

先进先出,后进后出,q = Queue()

过程

(1)把数据放到q队列中 put

(2)把书局从队列中拿出来 get

from multiprocessing import Process,Queue

q = Queue()

q.put(111)

res = q.get()

print (res)

执行

[root@node10 python]# python3 test.py
111

(3)当队列里面的值都拿出来了,已经没有数据的时候,在获取会阻塞

from multiprocessing import Process,Queue
q = Queue()
q.put(111)
res = q.get()
print (res)
res = q.get()

执行

[root@node10 python]# python3 test.py
111
Traceback (most recent call last): #这里阻塞住,使用ctrl+c退出
File "test.py", line 6, in <module>
res = q.get()
File "/usr/lib64/python3.6/multiprocessing/queues.py", line 94, in get
res = self._recv_bytes()
File "/usr/lib64/python3.6/multiprocessing/connection.py", line 216, in recv_bytes
buf = self._recv_bytes(maxlength)
File "/usr/lib64/python3.6/multiprocessing/connection.py", line 407, in _recv_bytes
buf = self._recv(4)
File "/usr/lib64/python3.6/multiprocessing/connection.py", line 379, in _recv
chunk = read(handle, remaining)
KeyboardInterrupt

(4)get_nowait 无论有没有都拿,如果拿不到,直接报错

from multiprocessing import Process,Queue
q = Queue()
q.put(111)
res = q.get()
print (res)
res = q.get_nowait()

执行

(5)异常处理,抑制错误

语法:

try:
code1
code2
except:
code1
code2

把可能出现异常的代码扔到try代码块中
如果发生异常,直接执行except中的代码块,抑制错误

q = Queue()
q.put(111)
res = q.get()
print (res)
try:
res = q.get_nowait()
except:
pass

执行

[root@node10 python]# python3 test.py
111

2 可以使用queue 指定队列长度

当指定队列的长度,例如对垒长度为3,则最多放3个,超过最大长度再放,会直接阻塞

from multiprocessing import Process,Queue
q = Queue(3)
q.put(1)
q.put(2)
q.put(3)
# q.put(4) 阻塞 如果队列已经满了,在放值,直接阻塞 q.put_nowait(4) #如果队列已经满了,再放值,直接报错

执行

异常处理

from multiprocessing import Process,Queue
q = Queue(3)
q.put(1)
q.put(2)
q.put(3)
# q.put(4) 阻塞 如果队列已经满了,在放值,直接阻塞 #q.put_nowait(4) #如果队列已经满了,再放值,直接报错
try:
q.put_nowait(4)
except:
pass

不会报错,但是没有输出

1.2 full empty介绍

如果队列满了,返回真,反之亦然

from multiprocessing import Process,Queue
q = Queue(3)
q.put(1)
q.put(2)
q.put(3)
# q.put(4) 阻塞 如果队列已经满了,在放值,直接阻塞 #q.put_nowait(4) #如果队列已经满了,再放值,直接报错
try:
q.put_nowait(4)
except:
pass
res = q.full()
print(res)

执行

[root@node10 python]# python3 test.py vi test.py
True

empty如果队列空了,返回真,反之亦然

from multiprocessing import Process,Queue
q = Queue(3)
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
print(q.get())
print(q.empty())

执行

[root@node10 python]# python3 test.py vi test.py
1
2
3
True

加如队列不为空

from multiprocessing import Process,Queue
q = Queue(3)
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
#print(q.get())
print(q.empty())

执行

[root@node10 python]# python3 test.py vi test.py
1
2
False

1.3 进程之间的通讯

from multiprocessing import Process,Queue
def func(q):
#主进程添加值,子进程可以通过队列拿到
res = q.get()
print ("I'm the subprocess",res)
q.put("from subprocess")
q = Queue()
p = Process(target=func,args=(q,))
p.start()
#主进程添加数据
q.put("I'm the main process")

执行

[root@node10 python]# python3 test.py vi test.py
I'm the subprocess I'm the main process

产生问题

def func(q):
#主进程添加值,子进程可以通过队列拿到
res = q.get()
print ("I'm the subprocess",res)
q.put("from subprocess")
q = Queue()
p = Process(target=func,args=(q,))
p.start()
#主进程添加数据
q.put("I'm the main process")
res = q.get()
print(res)

执行

[root@node10 python]# python3 test.py vi test.py
I'm the main process #这里发生阻塞

原因,是因为再主进程执行完成输入消息和消费消息之后,就结束了,子进程还没有执行完成,这时候子进程直接被干掉

使用join

子进程添加的值,主进程通过队列拿到

from multiprocessing import Process,Queue
def func(q):
#主进程添加值,子进程可以通过队列拿到
res = q.get()
print ("I'm the subprocess",res)
q.put("from subprocess")
q = Queue()
p = Process(target=func,args=(q,))
p.start()
#主进程添加数据
q.put("I'm the main process")
p.join()
#子进程添加的值,主进程通过队列拿到
res = q.get()
print(res)

执行

[root@node10 python]# python3 test.py vi test.py
I'm the subprocess I'm the main process
from subprocess

二 生产者和消费者模型

2.1 介绍

爬虫例子

1号进程负责爬取网页中所有内容,可以看成一个生产者
2号进程负责匹配提取网页中的关键字,可以看成一个消费者

有时可能生产者必消费者块,反之亦然,所以为了减少生产者和消费者速度上的差异化,加了一个中间的缓冲队列

生产者和消费者模型从程序上看就是一个存放数据和拿取数据的过程,最为理想的生产者消费者模型,两者之间的速度相对平均.

2.2 建立模型

模拟汽车生产和消费

from multiprocessing import Process,Queue
import random,time
#消费者模型
def consumer(q,name):
while True:
car = q.get()
print("%s buy a %s"%(name,car))
#生产者模型
def producer(q,name,car):
for i in range(3):
print("%s produce %s,%s"%(name,car,i))
q.put(car+str(i)) q = Queue()
#消费者
c1 = Process(target=consumer,args=(q,"Marketting"))
c1.start() #生产者
p1 = Process(target=producer,args=(q,"Factory","BYD"))
p1.start()

执行

[root@node10 python]# vi test.py
[root@node10 python]# python3 test.py vi test.py
Factory produce BYD,0
Factory produce BYD,1
Factory produce BYD,2
Marketting buy a BYD0
Marketting buy a BYD1
Marketting buy a BYD2

生产太快,加一个延迟

import random,time
#消费者模型
def consumer(q,name):
while True:
car = q.get()
time.sleep(random.uniform(0.1,1))
print("%s buy a %s"%(name,car))
#生产者模型
def producer(q,name,car):
for i in range(3):
time.sleep(random.uniform(0.1,1))
print("%s produce %s,%s"%(name,car,i))
q.put(car+str(i)) q = Queue()
#消费者
c1 = Process(target=consumer,args=(q,"Marketting"))
c1.start() #生产者
p1 = Process(target=producer,args=(q,"Factory","BYD"))
p1.start()

执行

[root@node10 python]# python3 test.py vi test.py
Factory produce BYD,0
Factory produce BYD,1
Marketting buy a BYD0
Marketting buy a BYD1
Factory produce BYD,2
Marketting buy a BYD2
#这里有阻塞

解决最终的阻塞问题

from multiprocessing import Process,Queue
import random,time
#消费者模型
def consumer(q,name):
#死循环,即一直等待生产出来,然后消费,最终在这里会阻塞
while True:
car = q.get()
#在这里判断,当car时空值,退出
if car is None:
break
#加入延迟阻塞
time.sleep(random.uniform(0.1,1))
print("%s buy a %s"%(name,car))
#生产者模型
def producer(q,name,car):
for i in range(3):
time.sleep(random.uniform(0.1,1))
print("%s produce %s,%s"%(name,car,i))
q.put(car+str(i)) q = Queue()
#消费者
c1 = Process(target=consumer,args=(q,"Marketting"))
c1.start() #生产者
p1 = Process(target=producer,args=(q,"Factory","BYD"))
p1.start() #由于下面插入空值,而且在消费者做了判断,收到空值就会退出,这里执行完,主进程就会退出,导致消费者子进程无法完成消费,使用join
p1.join() #在这里加一个控制,当执行完生产,在这里插入一个空值
q.put(None)

执行

[root@node10 python]# python3 test.py vi test.py
Factory produce BYD,0
Marketting buy a BYD0
Factory produce BYD,1
Marketting buy a BYD1
Factory produce BYD,2
Marketting buy a BYD2

则一个简单模型建立

042.Python进程队列介绍的更多相关文章

  1. Python——进程队列

    队列 先进先出 from multiprocessing import Queue q = Queue(5) #队列的大小 q.put(1) #放入内容 q.put(2) #放入内容 q.put(3) ...

  2. python 进程队列

    #_*_coding:utf-8_*_ from multiprocessing import Process,Queue import os,time def f(q,n): q.put([n,'h ...

  3. python 进程介绍 进程简单使用 join 验证空间隔离

    一.多道程序设计技术(详情参考:https://www.cnblogs.com/clschao/articles/9613464.html) 所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行 ...

  4. 进击的Python【第十一章】:消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用

    消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下消息队列的基本思路. 还记得原来写过Queue的文章,不管是线程queu ...

  5. Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信

    Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...

  6. 2.Python进程间的通信之队列(Queue)和生产者消费者模型

    一.队列 1.1 概念介绍-----multiprocess.Queue 创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递. Queue([maxsize] ...

  7. python RabbitMQ队列使用(入门篇)

    ---恢复内容开始--- python RabbitMQ队列使用 关于python的queue介绍 关于python的队列,内置的有两种,一种是线程queue,另一种是进程queue,但是这两种que ...

  8. multiprocess模块---进程---进程队列

    首先明白几个概念: 同步:做完一件事情,再做另外一件事情 异步:做一件事情的时候,可以再做另外一件事情 阻塞:recv  sleep accept input recvfrom 非阻塞:没有遇见上面这 ...

  9. python 进程和线程(代码知识部分)

    二.代码知识部分 一 multiprocessing模块介绍: python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情 ...

随机推荐

  1. Day05_25_Super关键字

    Super关键字 Super关键字的所用 Super关键字的用法有三种: 在子类的成员方法中,访问父类的成员变量. 在子类的成员方法中,访问父类的成员方法. 在子类的构造方法中,访问父类的构造方法. ...

  2. Pytorch系列:(二)数据加载

    DataLoader DataLoader(dataset,batch_size=1,shuffle=False,sampler=None, batch_sampler=None,num_worker ...

  3. 痛!痛!痛!我们的好兄弟Git,一路走好!

    文章是正经文章,标题不要在意,哈哈 Git作为现在主流的版本控制工具,但是如何在软件开发过程中进行合理的分支管理是一个见仁见智的问题. 接下来我会对比下现有的几种比较普遍的分支管理方式和之前在阿里时候 ...

  4. 7.If语句

    if单选择结构 语法: if(布尔表达式){ //如果布尔表达式为true将执行的语句 } 例: import java.util.Scanner; public class IfDemo { pub ...

  5. 基于FOC伺服电机驱动的Parallel Scara Robot的设计及实现

    上个学期做了一个BLDC的FOC驱动后,我便开始了基于此类电机驱动的机器人项目尝试.之前想做的是串联机械臂,奈何找不到合适的电机并且串联机械臂十分需要减速机,使得项目对于我来说(经济方面)很艰难,恰巧 ...

  6. hdu1572 水搜索

    题意: 中文的不解释; 思路:           其实就是一个水的搜索,直接搜索不会超时,还有别跑最短路了,题目没要求跑最短路,别读错题,刚开始自己嘚嗖的跑了一边最短路 wa了 ,正好最近看了STL ...

  7. Http Get与Post的区别

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  8. Windows核心编程 第十九章 DLL基础

    第1 9章 D L L基础 这章是介绍基本dll,我就记录一些简单应用,dll的坑点以及扩展后面两章会说,到时候在总结. 自从M i c r o s o f t公司推出第一个版本的Wi n d o w ...

  9. 『政善治』Postman工具 — 4、HTTP请求基础组成部分介绍

    目录 1.Method 2.URL 3.Headers 4.body 一般来说,所有的HTTP Request都有最基础的4个部分组成:URL. Method. Headers和body. 1.Met ...

  10. 找大于等于一个数的最小的2^n

    最近看hashmap源码时,发现给定初始capacity计算threshold的过程很巧妙. 1 static final int tableSizeFor(int cap) { 2 int n = ...