一、Queue是通过multiprocessing使用
from multiprocessing import Process,Queue
import time
import random
import os
def consumer(q):
while True:
res=q.get()
if res is None:
break
time.sleep(random.randint(1,3))
print('\033[45m%s 吃了 %s\033[0m' % (os.getpid(), res))
def producer(q):
for i in range(5):
time.sleep(2)
res='包子%s' %i
q.put(res)
print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
q.put(None)
if __name__ == '__main__':
q=Queue()
#生产者们:厨师们
p1=Process(target=producer,args=(q,)) #消费者们:吃货们
p2=Process(target=consumer,args=(q,)) p1.start()
p2.start()
p1.join()
p2.join()
print('主')

生产者,消费者模型1

from multiprocessing import Process,Queue
import time
import random
import os
def consumer(q):
while True:
res=q.get()
if res is None:break
time.sleep(random.randint(1,3))
print('\033[45m%s 吃了 %s\033[0m' % (os.getpid(), res))
def product_baozi(q):
for i in range(3):
time.sleep(2)
res='包子%s' %i
q.put(res)
print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
def product_jiaozi(q):
for i in range(3):
time.sleep(2)
res='饺子%s' %i
q.put(res)
print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
def product_dabing(q):
for i in range(3):
time.sleep(2)
res='大饼%s' %i
q.put(res)
print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
if __name__ == '__main__':
q=Queue()
#生产者们:厨师们
p1=Process(target=product_baozi,args=(q,))
p2=Process(target=product_jiaozi,args=(q,))
p3=Process(target=product_dabing,args=(q,))
#消费者们:吃货们
p4=Process(target=consumer,args=(q,))
p5=Process(target=consumer,args=(q,)) p_l=[p1,p2,p3,p4,p5]
for p in p_l:
p.start()
# for p in p_l:
# p.join()
# p1.start()
# p2.start()
# p3.start()
# p4.start()
# p5.start()
p1.join()
p2.join()
p3.join()
q.put(None)
q.put(None)
p4.join()
p5.join()
print('主')

生产者,消费者模型2

  q .put方法用以插入数据到队列中,put方法还有两个可选参数:blocked和timeout。如果blocked为True(默认值),
并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间。
如果超时,会抛出Queue.Full异常。如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常。
q.get方法可以从队列读取并且删除一个元素。同样,get方法有两个可选参数:blocked和timeout。

如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。
如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常.
1:可以往队列里放任意类型的数据 2 队列:先进先出
from multiprocessing import Process,Queue
q=Queue(3)
q.put('first')
q.put('second')
q.put('third')
# q.put('fourht') print(q.get())
print(q.get())
print(q.get())
# print(q.get())

q.put和q.get


from multiprocessing import Process,Queue
q=Queue(3)
q.put('first',block=False)
q.put('second',block=False)
q.put('third',block=False)
# q.put('fourth',block=False)
q.put('fourth',block=True,timeout=3) q.get(block=False)
q.get(block=True,timeout=3) q.get_nowait() #q.get(block=False)

p.get的参数

二、JoinableQueue同样通过multiprocessing使用。 
     JoinableQueue的实例p除了与Queue对象相同的方法之外还具有:
   q.task_done():使用者使用此方法发出信号,表示q.get()的返回项目已经被处理。如果调用此方法的次数大于从队列中删除项目的数      量,将引发ValueError异常
 q.join():生产者调用此方法进行阻塞,直到队列中所有的项目均被处理。阻塞将持续到队列中的每个项目均调用q.task_done()方法为止
from multiprocessing import Process,JoinableQueue
import time
import random
import os
def consumer(q):
while True:
res=q.get()
time.sleep(random.randint(1,3))
print('\033[45m%s 吃了 %s\033[0m' % (os.getpid(), res))
q.task_done()
def product_baozi(q):
for i in range(5):
time.sleep(2)
res='包子%s' %i
q.put(res)
print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
q.join()
if __name__ == '__main__':
q=JoinableQueue()
#生产者们:厨师们
p1=Process(target=product_baozi,args=(q,))
#消费者们:吃货们
p4=Process(target=consumer,args=(q,))
p4.daemon=True
p1.start()
p4.start()
p1.join()
print('主')

生产者,消费者模型3

from multiprocessing import Process,JoinableQueue
import time
import random
import os
def product_baozi(q):
for i in range(3):
time.sleep(2)
res='包子%s' %i
q.put(res)
print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
q.join()
def product_jiaozi(q):
for i in range(3):
time.sleep(2)
res='饺子%s' %i
q.put(res)
print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
q.join()
def product_dabing(q):
for i in range(3):
time.sleep(2)
res='大饼%s' %i
q.put(res)
print('\033[44m%s 制造了 %s\033[0m' %(os.getpid(),res))
q.join()
def consumer(q):
while True:
res = q.get()
time.sleep(random.randint(1, 3))
print('\033[45m%s 吃了 %s\033[0m' % (os.getpid(), res))
q.task_done()
if __name__ == '__main__':
q=JoinableQueue()
#生产者们:厨师们
p1=Process(target=product_baozi,args=(q,))
p2=Process(target=product_jiaozi,args=(q,))
p3=Process(target=product_dabing,args=(q,))
#消费者们:吃货们
p4=Process(target=consumer,args=(q,))
p5=Process(target=consumer,args=(q,))
p4.daemon=True
p5.daemon=True
p_l=[p1,p2,p3,p4,p5]
for p in p_l:
p.start()
p1.join()
p2.join()
p3.join()
print('主')

生产者,消费者模型4

三,互斥锁

互斥锁应用:

from multiprocessing import Process,Lock
import os
import time
def work(mutex):
mutex.acquire()
print('task[%s] 上厕所' %os.getpid())
time.sleep(3)
print('task[%s] 上完厕所' %os.getpid())
mutex.release()
if __name__ == '__main__':
mutex=Lock()
p1=Process(target=work,args=(mutex,))
p2=Process(target=work,args=(mutex,))
p3=Process(target=work,args=(mutex,))
p1.start()
p2.start()
p3.start()
print('主')

互斥锁

四、模拟抢票:

from multiprocessing import Process,Lock
import json
import time
import random
import os
def search():
dic=json.load(open('db.txt',))
print('剩余票数%s' %dic['count']) def get_ticket():
dic=json.load(open('db.txt',))
if dic['count'] > 0:
dic['count']-=1
json.dump(dic,open('db.txt','w'))
print('%s 购票成功' %os.getpid())
def task(mutex):
search()
time.sleep(random.randint(1, 3)) #模拟购票一系列繁琐的过程所花费的时间
mutex.acquire()
get_ticket()
mutex.release()
if __name__ == '__main__':
mutex=Lock()
for i in range(50):
p=Process(target=task,args=(mutex,))
p.start()

模拟抢票

五、process对象的其他属性补充

from multiprocessing import Process
import os
import time
def work():
print('%s is working' %os.getpid())
time.sleep(3)
if __name__ == '__main__':
p1=Process(target=work)
p2=Process(target=work)
p3=Process(target=work)
p1.daemon=True
p2.daemon=True
p3.daemon=True
p1.start() #初始化1
p2.start() #初始化2
p3.start() #初始化3 p3.join()
p1.join()
p2.join()
print('基于初始化的结果来继续运行')

process属性补充1

from multiprocessing import Process
import os
import time
def work():
print('%s is working' %os.getpid())
time.sleep(3)
if __name__ == '__main__':
p1=Process(target=work)
# p2=Process(target=work)
# p3=Process(target=work)
p1.start() #初始化1
# p2.start() #初始化2
# p3.start() #初始化3 # p1.terminate()
# time.sleep(3)
# print(p1.is_alive())
print(p1.name)
print(p1.pid)
print('基于初始化的结果来继续运行')

process属性补充2

 

python之进程----Queue的更多相关文章

  1. Python开发【笔记】:what?进程queue还能生产出线程!

    进程queue底层用线程传输数据 import threading import multiprocessing def main(): queue = multiprocessing.Queue() ...

  2. Python:进程

    由于GIL的存在,python一个进程同时只能执行一个线程.因此在python开发时,计算密集型的程序常用多进程,IO密集型的使用多线程 1.多进程创建: #创建方法1:将要执行的方法作为参数传给Pr ...

  3. python中的Queue(队列)详解

    一.Queue简介 python中的队列分类可分为两种: 1.线程Queue,也就是普通的Queue 2.进程Queue,在多线程与多进程会介绍. Queue的种类: FIFO:  Queue.Que ...

  4. python 之进程篇

    多线程给我们的感觉 1.因为GIL的存在,一个进程的多线程同一时刻只能进去一个,感觉是假的并发 2.只适合I/O密集型的任务 3.针对计算密集型,就挂了(变成串行了) 在python中想要充分利用多核 ...

  5. Python之进程

    进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代 ...

  6. {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll

    Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...

  7. python开发进程:共享数据&进程池

    一,共享数据 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合 通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求, 还可以扩展 ...

  8. python的进程和线程

    关于进程: An executing instance of a program is called a process.程序的执行实例称为进程. Each process provides the ...

  9. Python之进程 进阶 下

    在python程序中的进程操作 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起 ...

随机推荐

  1. MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例

    dotnet core 2.0 发布已经好几天了,期间也把原来 dotnet core 1.1 的 MVC 项目升级到了 2.0,升级过程还是比较顺利的,变动也不是太多.升级的过程中也少不了 Enti ...

  2. 【Ubuntu 16】深入Ubuntu文件系统

    Ubuntu文件系统的设计目的就是把文件有序地组织在一起,提供一个从逻辑上组织文件的文件系统.除了文件的组织外,文件安全也是文件系统的设计要点,所以文件的访问权限是文件系统不可缺少的组成部分 Ubun ...

  3. .net core 2.0学习笔记(六):Remoting核心类库RealProxy迁移

    在学习.net core的过程中,我们已经明确被告知,Remoting将不会被支持.官方的解释是,.net framework 类型包含了太多的Runtime的内容,是一个非常重量级的服务实现,已被确 ...

  4. JAVA中反射机制一

    反射一 基本概念 一.反射机制的基本概念 什么是反射?反射是指在运行状态中,对于任意一个类,都可以获取到这个类的所有属性和方法:对于任意一个对象,都能够调用这个对象的任意方法和属性:这种动态获取信息及 ...

  5. ReactNative环境搭建扩展篇——安装后报错解决方案

    之前一篇写了<逻辑性最强的React Native环境搭建与调试>说了RN的安装,今天在这里做一个复盘,让我们能够更直观更深入的了解React Native(以下简称RN),这一篇重点来说 ...

  6. 谈谈分布式版本管理工具Git

    一.主流的版本管理工具 目前在企业中比较主流的版本管理工具有:GIT.SVN.CVS等等. 二.什么是Git? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.是 L ...

  7. exjs上传图片异常:com.jspsmart.upload.SmartUploadException: File can't be saved (1120).

    错误: 文件名格式不对:未命??.jpg SmartUpload mySmartUpload = new SmartUpload(); com.jspsmart.upload.File myFile ...

  8. java TreeSet应用

    这篇是紧接着上一篇而写的,具体的实现TreeSet中有序的第二中方法 首先新建一个类,此类就是用于集合中存放的对象 然后定义一个类,实现Comparator中的CompareTo()方法 最后一个测试 ...

  9. 正则表达式 提取<A>标签

    功能用途 主要实现了提取html代码中的a标签和url地址. 示例代码 Regex regex = new Regex("href\\s*=\\s*(?:\"(?<1> ...

  10. 为Markdown文件生成目录

    缘由 思路 效果 代码实现 缘由 Markdown源生文件源生不支持目录,目前比较主流的生成目录的方式(各式插件),都是转化为HTML文件.虽然HTML文件可以生成眼花缭乱的目录,但是修改起来又没有M ...