进程队列介绍

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. Dynamics CRM报表无法访问提示“报表服务器无法访问或使用加密密钥。你可能需要将服务器添加到扩展组,或重新导入”

    当我们部署Dynamics CRM的环境的时候如果报表配置的不规范会出现很多问题,尤其是这个问题相对来说更棘手,解决起来非常麻烦. 网上很多教程都说直接到报表配置页删除密钥就可以了,实际上删除的时候会 ...

  2. Linux 用户和用户组管理(useradd userdel groupadd groupdel)

    Linux 用户和用户组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统. Linux系统用户账户的 ...

  3. Centos下搭建DNS域名解析服务器

    Centos下搭建DNS域名解析服务器 DNS  即Domain Name System(域名系统)的缩写,它是一种将ip地址转换成对应的主机名或将主机名转换成与之相对应ip地址的一种机制.其中通过域 ...

  4. Tomcat9配置HTTP/2

    1 概述 Tomcat从Tomcat8的一些较新版本就支持HTTP/2了,Tomcat9直接支持,本文首先讲述了相关HTTP/2的特性,接着利用一个简单的开源工具mkcert生成证书并利用该证书配置H ...

  5. 敏捷史话(十五):我发明了敏捷估算扑克牌 —— James Greening

    雪鸟会议 雪鸟会议前夕,James Grenning 在 Object Mentor 与 Robert C. Martin 一同工作,彼时组织雪鸟会议的 Bob 大叔盛情邀请 James,告知他会议的 ...

  6. Day01_10_Scanner 接收用户输入

    Scanner函数 import java.util.Scanner; class ScannerTest { public static void main(String[] args){ Syst ...

  7. 构建基于表单配置的 Jenkins 测试项目(接口、UI、APP、Jmeter)

    1. 第一个 hello world 项目 2. 构建自动触发的项目(接口测试) 1)新建测试项目(执行测试脚本) 2)新建 Maven 打包项目 3)手动执行构建 4)修改 Web 工程代码并 pu ...

  8. kubernetes集群证书更新

    kubeadm 默认证书为一年,一年过期后,会导致api service不可用,使用过程中会出现:x509: certificate has expired or is not yet valid. ...

  9. hdu3706基础的单调队列

    题意: 解释题意不如直接把这个题粘贴过来,因为题目很短题意很容易懂. Give you three integers n, A and B.  Then we define Si = Ai mod B ...

  10. ASLR 的关闭与开启(适用于 Windows7 及更高版本)

    ASLR 是一种针对缓冲区溢出的安全保护技术,通过对堆.栈.共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术 有的时候 ...