进程队列介绍

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. CSS3常见动画

    一.是什么 CSS动画(CSS Animations)是为层叠样式表建议的允许可扩展标记语言(XML)元素使用CSS的动画的模块 即指元素从一种样式逐渐过渡为另一种样式的过程 常见的动画效果有很多,如 ...

  2. IDEA如何在一个项目空间下管理多个项目?

    用过Eclipse和IDEA编程工具都知道,Eclipse创建新项目时都是在同一项目空间下,而IDEA一个项目空间只能有一个项目,创建项目时会创建.idea文件. 所以每次创建完项目或者打开另一个项目 ...

  3. 6.2set用法

    目录 1.set的定义 2.set容器内元素的访问 3.set常见使用的函数 set可以内部进行自动递增排序,且自动去除了重复元素 1.set的定义 set<typename> name; ...

  4. Java第三章基础学习课后题练习

    小结:final 类型 变量名 = 数值 定义常量使用 变量的原则*** 一定要"先声明,后使用",变量使用前必须先声明.这点就没php好玩:两种键盘输入方式InputStream ...

  5. ASP.NET Core扩展库之Http通用扩展

    本文将介绍Xfrogcn.AspNetCore.Extensions扩展库对于Http相关的其他功能扩展,这些功能旨在处理一些常见需求, 包括请求缓冲.请求头传递.请求头日志范围.针对HttpClie ...

  6. JFX11+Maven+IDEA 发布跨平台应用的完美解决方案

    1 概述 前几天写了两篇关于JFX+IDEA打包跨平台应用的文章,这篇是使用IDEA自带功能打包的,这篇是使用Maven进行打包的,但是效果不太满意,因为从JDK9开始实现模块化,同时JFX部分从JD ...

  7. Day14_76_反射与静态语句块

    反射与静态语句块 * 获取class对象与静态语句块的关系 package com.shige.Reflect; import java.nio.channels.ClosedSelectorExce ...

  8. Day01_12_Java的类型转换

    Java类型转换 实例 public class 类型转换 { public static void main(String[] args) { int i =128; byte b= (byte) ...

  9. SAAS云平台搭建札记: (四) AntD For React使用react-router-dom路由接收不同参数页面不刷新的问题

    在.net开发员眼里,如果使用MVC,根据路由匹配原则,可以通过各种方式接收参数,比如 /Post/List/1, /Post/List/2,或者 /Post/List?id=1,/Post/List ...

  10. php的call_user_func_array()使用场景

    1..动态调用普通函数时,比如参数和调用方法名称不确定的时候很好用 function sayEnglish($fName, $content) { echo 'I am ' . $content; } ...