进程队列介绍

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. BUAA_2021_SE_Pair_Work_#3_Review

    结对项目第三阶段博客 项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目-第三阶段 我在这个课程的目标是 通过课程学习,完成第一个可以称之为 ...

  2. Java后端进阶-网络编程(Netty责任链Pipeline)

    设计模式-责任链模式 一个责任链模拟demo package com.study.hc.net.netty.demo; // -----链表形式调用------netty就是类似的这种形式 publi ...

  3. Markdown排版介绍

    如何排版章节 Markdown: 大标题 ========== 小标题 ---------- # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 例如 三级 和四级 发布后的效果: 三 ...

  4. TLS Poison - When TLS Hack you

    0x00 前言 本次学习的是2020 Blackhat 的一篇文章When TLS Hacks you,简单来说,作者提出了一种新的SSRF攻击思路:利用DNS重绑定和TLS协议的会话恢复进行攻击.具 ...

  5. 二向箔web安全学院 --新手入门

    二向箔安全学院 click here 新手入门|梦境穿越 1.要建立一个这样的观念|理解:计算机之所以是计算机,是它具有重复进行某种指令的特征,因而我们写的代码 or 脚本,本质上就是让计算机代替我们 ...

  6. 反病毒攻防研究第005篇:简单木马分析与防范part1

    一.前言 病毒与木马技术发展到今天,由于二者总是相辅相成,你中有我,我中有你,所以它们之间的界限往往已经不再那么明显,相互之间往往都会采用对方的一些技术以达到自己的目的,所以现在很多时候也就将二者直接 ...

  7. 使用EasySYS搭建驱动开发基本框架

    提供EasySYS的下载地址:http://bbs.pediy.com/showthread.php?p=956643,看雪上有提供下载,自行百度. EasySYS你能够帮我们快速的搭建驱动的开发框架 ...

  8. UVA10382喷水装置

    题意:       给你一个矩形的空地,然后有一些圆形的喷水装置,每个装置的圆心都在矩形宽的中间位置,然偶给你每个矩形的圆心位置和半径,问你最少多少个喷水装置可以把矩形的所有编辑都覆盖上. 思路:   ...

  9. POJ3080方法很多(暴力,KMP,后缀数组,DP)

    题意:       给n个串(n>=2&&n<=10),每个串长度都是60,然后问所有串的最长公共子串,如果答案不唯一输出字典序最小的. 思路:直接暴力,枚举+KMP,后缀 ...

  10. POJ3233不错的矩阵(矩阵套矩阵)

    题意:        给一个n*n的矩阵A,然后求S=A + A^2 + A^3 + ..+ A^k. 思路:       矩阵快速幂,这个题目挺新颖的,以往的矩阵快速幂都是退出公式,然后构造矩阵,这 ...