进程队列介绍

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. odoo视图入门学习- tree视图的使用

    上一篇内容:如何快速在odoo中创建自己的菜单 前言 上面的内容我们已经学会了如何去创建odoo的菜单,下面我们要学习的是odoo的基础视图tree视图,我们的目标是实现型号管理的列表页面 创建mod ...

  2. python中栈的实现

    栈是一种线性数据结构,用先进后出或者是后进先出的方式存储数据,栈中数据的插入删除操作都是在栈顶端进行,常见栈的函数操作包括 empty() – 返回栈是否为空 – Time Complexity : ...

  3. Maven导入依赖慢解决办法

    新安装的Maven,下载jar包速度会很慢,因为官方的库在国外, 连上并下载速度很慢. 因为maven是支持镜像的,我们就可以本地maven目录下的的conf目录下的setting.xml文件中找到标 ...

  4. 使用Leaflet创建地图模块

    背景 最近需要为某单位开发地图展示系统,因此开始涉略和使用Leaflet这个轻量级地图库. 创建基础地图需要以下几步 引入相关js和css文件,创建基础地图 <div id="map& ...

  5. 由电脑专卖系统引发的Java设计模式:访问者模式

    目录 定义 意图 解决问题 何时使用 优缺点 结构 电脑专卖系统 定义 访问者模式是对象的行为型模式,它的目的是封装一些施加于某些数据结构元素之上的操作,一旦这些操作需要修改的话,接收这个操作的数据结 ...

  6. 吉特日化MES&WMS系统--三色灯控制协议转http

    关于硬件控制大部分都是使用CS客户端程序,一般连接口都是用网口,串口,USB口等,应用通讯是不支持HTTp协议操作的,而目前一般做技术的人员都在于BS开发,使用HTTP 协议,所以在硬件交互上可能觉得 ...

  7. ORM 创新解放劳动力 -SqlSugar 新功能介绍

    介绍 SqlSugar是一款 老牌 .NET 开源ORM框架,由果糖大数据科技团队维护和更新 ,Github star数仅次于EF 和 Dapper 优点: 简单易用.功能齐全.高性能.轻量级.服务齐 ...

  8. 四两拨千斤——你不知道的VScode编码TypeScript的技巧

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://blog.bitsrc 如果你体验过JAVA这种强类型语言带来的便利,包括其丰富的 ...

  9. 如何利用C++的time头文件获取系统时间

    C++提供了time.h头文件进行时间编辑操作,可以把时间格式化进tm结构体,方便使用.MFC框架中的ctime类就是基于time.h封装的. 代码样例: #include <iostream& ...

  10. Windows核心编程笔记之作业

    创建作业,并加以限制 HANDLE WINAPI CreateJob() { BOOL IsInJob = FALSE; DWORD ErrorCode = NULL; // 不能将已经在作业中的进程 ...