1.事件:

# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/17 10:38
# !@Author TrueNewBee # 事件:通过一个信号 来控制 多个进程 同时 执行或者阻塞
# 一个信号可以使所有的进程都进入阻塞状态
# 也可以控制所有进程的解除阻塞
# 一个事件被创建之后,默认是阻塞状态 # set 和 clear
# 分别用来修改一个事件的状态 True或者False
# is_set 用来查看一个事件的状态
# wait 是根据事件的状态来解决自己是否在wait处阻塞
# False阻塞 True不阻塞 # from multiprocessing import Event
#
#
# def event():
# e = Event() # 创建一个事件
# print(e.is_set()) # 查看一个事件的状态,默认设置成阻塞
# e.set() # 将这个事件的状态改为True
# print(e.is_set())
# e.wait() # 是依据e.is_set()的值来决定是否阻塞
# print(123456)
# e.clear() # 将这个事件的状态改为False
# print(e.is_set())
# e.wait() # 等待事件的信号被编程True
# print('*'*10)
#
#
# if __name__ == '__main__':
# event() # 红绿灯事件
# 用事件控制信号,控制进程
import time
import random
from multiprocessing import Process
from multiprocessing import Event def cars(e2, i1):
"""创建一个车"""
if not e2.is_set():
print("car%i1在等待" % i1)
e2.wait() # 阻塞,直到得到一个 事件状态变成True的信号
print("car%s通过" % i1) def light(e1):
"""灯是独立的进程"""
while True:
if e1.is_set():
time.sleep(2)
e1.clear()
print("绿灯亮了")
else:
e1.set()
print("红灯亮了")
time.sleep(2) if __name__ == '__main__':
e = Event()
traffic = Process(target=light, args=(e, ))
traffic.start()
for i in range(20):
car = Process(target=cars, args=(e, i))
car.start()
time.sleep(random.random())

2.队列

# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/17 12:19
# !@Author TrueNewBee # import time
# from multiprocessing import Queue
#
#
# q = Queue(5)
# q.put(1) # 向队列里面放值
# q.put(2)
# q.put(3)
# q.put(4)
# q.put(5)
# # 如果队列满了再添加则出现堵塞
# print(q.full()) # 队列是否满了
# print(q.get()) # 取出来数
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())
# # 如果队列全取出了再去将出现阻塞
# print(q.empty()) # 判断队列是否为空
# while True:
# """检查队列是否为空"""
# try:
# q.get_nowait()
# except :
# print("队列已空")
# time.sleep(1) from multiprocessing import Process
from multiprocessing import Queue # 队列生产和消费数据
def produce(q1):
"""队列存储数据"""
q1.put('hello') def consume(q2):
"""队列消费数据"""
print(q2.get()) if __name__ == '__main__':
q = Queue()
p = Process(target=produce,args=(q, ))
p.start()
c = Process(target=consume, args=(q, ))
c.start()

3.生产者和消费者 joinableQueue模型:

# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/17 15:04
# !@Author TrueNewBee # 队列
# 生产者消费者模型 解决供需不平衡的问题
import time
import random
from multiprocessing import Process, JoinableQueue def consumer(name, q1):
"""负责消费生产的东西"""
while True:
food = q1.get()
if food is None: # 判断为空则停止这个循环
print('%s获取到一个空' % name)
break
print('\033[31m%s消费了%s\033[0m' % (name, food))
time.sleep(random.randint(0, 2))
q1.task_done() # 提交回执 count - 1 def producer(name, food, q1):
"""负责生产包子"""
for i in range(10):
time.sleep(random.randint(0, 2))
f = '%s生产了%s%s' % (name, food, i)
print(f)
q1.put(f)
q1.join() # 阻塞,直到一个队列中的数据 全部被执行完毕 if __name__ == '__main__':
q = JoinableQueue(20)
p1 = Process(target=producer, args=('Egon', '包子', q))
p2 = Process(target=producer, args=('WuSir', '泔水', q))
c1 = Process(target=consumer, args=('jinBoss', q))
c2 = Process(target=consumer, args=('alex', q))
p1.start()
p2.start()
c1.daemon = True # 成为守护进程,主进程中的代码执行完毕之后,子进程自动结束
c2.daemon = True
c1.start()
c2.start()
p1.join() # 感知一个进程结束
p2.join() # 在消费者这一端
# 每次获取一个数据
# 处理一个数据
# 发送一个记号:标志一个数据被处理成功 # 在生产者这一端
# 每一次生产一个数据
# 且每一次生产的数据放在队列中
# 在队列中刻上一个记号
# 当生产者全部生产完毕后
# join信号: 已经停止生产数据了
# 且要等待之前被刻上的记号都被消费完
# 当数据都被处理完时,join阻塞结束 # consumer 中把所有的任务消耗完
# produce 端的join感知到,停止阻塞
# 所有的producer进程结束
# 主进程中的p.join结束
# 守护进程(消费者进程)结束

4. 生产者和消费者 Queue模型:

# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/17 15:04
# !@Author TrueNewBee # 队列
# 生产者消费者模型 解决供需不平衡的问题
import time
import random
from multiprocessing import Queue, Process def consumer(name, q1):
"""负责消费生产的东西"""
while True:
food = q1.get()
if food is None: # 判断为空则停止这个循环
print('%s获取到一个空' % name)
break
print('\033[31m%s消费了%s\033[0m' % (name, food))
time.sleep(random.randint(0, 2)) def producer(name, food, q1):
"""负责生产包子"""
for i in range(10):
time.sleep(random.randint(0, 2))
f = '%s生产了%s%s' % (name, food, i)
print(f)
q1.put(f) if __name__ == '__main__':
q = Queue(20)
p1 = Process(target=producer, args=('Egon', '包子', q))
p2 = Process(target=producer, args=('WuSir', '泔水', q))
c1 = Process(target=consumer, args=('jinBoss', q))
c2 = Process(target=consumer, args=('alex', q))
p1.start()
p2.start()
c1.start()
c2.start()
p1.join() # 感知一个进程结束
p2.join()
q.put(None)
q.put(None)

7.17python的更多相关文章

  1. 19/03/17Python笔记

    一.判断元素是否为数字 ".isdigit() #判断123是不是数字,是的话输出True,不是输出False 二.标志位 需要死循环时,不一定用 while True 还可以用 while ...

  2. day 17python 面对对象之继承

    一:什么面向对象的继承? 比较官方的说法就是: 继承(英语:inheritance)是面向对象软件技术当中的一个概念.如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A ...

  3. 17-Python执行JS代码--PyExecJS、PyV8、Js2Py

    一.Python执行JS代码--PyExecJS.PyV8.Js2Py 1.1.PyExecJS PyExecJS的优点是您不需要照顾JavaScript环境.特别是,它可以在Windows环境中运行 ...

  4. 【Python高级工程师之路】入门+进阶+实战+爬虫+数据分析整套教程

    点击了解更多Python课程>>> 全网最新最全python高级工程师全套视频教程学完月薪平均2万 什么是Python? Python是一门面向对象的编程语言,它相对于其他语言,更加 ...

  5. 此贴告诉你:为啥shell脚本人,不建议学python

    py很强大,我承认.但在运维方面,py不但不强大,还有硬伤.正因为有下述硬伤,所以我们运维,还是用shell多,用py极少.我看到用shell的人很多,你建议人用python,人说py是很好,但下一秒 ...

  6. [Python+Java双语版自动化测试(接口测试+Web+App+性能+CICD)

    [Python+Java双语版自动化测试(接口测试+Web+App+性能+CICD)开学典礼](https://ke.qq.com/course/453802)**测试交流群:549376944**0 ...

  7. [Python] Tkinter command

    例1:创建按钮 import tkinter as tk class App: def __init__(self,root): frame = tk.Frame(root) frame.pack() ...

随机推荐

  1. android-activity生命周期方法

    整个Activity生命周期中的所有方法,我们可以根据程序的需要来覆盖相应的方法: public class Activity extends ApplicationContext { //创建的时候 ...

  2. C语言的原码,反码,补码

    1)原码表示 原码表示法是机器数的一种简单的表示法.其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示.设有一数为x,则原码表示可记作[x]原. 例如,X1= +1010110 X2= 一1 ...

  3. mipmap和drawable文件夹的区别

    在Android上创建工程,会默认创建mipmap文件夹.之前在Eclipse上创建的是drawable的文件夹.那么这两个有什么区别呢? 问题: I'm working with android s ...

  4. <转>房租分配问题

    本文转自:https://blog.codingnow.com/2012/12/share_rent.html 今天读到策划同学的周报中提到的一个关于合租房子的分摊房租问题. 引用周报中的一节如下: ...

  5. 如何将Ubuntu Server 12.04 升级到 Ubuntu Server 14.04 LTS

    升级Ubuntu 12.04到Ubuntu 14.04方法如下: 步骤一:在终端中运行下面的命令,它将安装所有的升级包.$ sudo apt-get update && sudo ap ...

  6. Redis资料整理

    1.Redis命令參考中文简体版. 2.java操作redis.jedis使用api 3.Redis学习笔记. 4.浅谈Redis数据库的键值设计 5.Redis资料汇总专题 6.MongoDB资料汇 ...

  7. Android---Hellow World

    在搭建好了Android的开发环境后,接下来要做的事情就是开始开发我们的第一个Android应用程序---Hello World. 1.我们新建一个android项目: Application Nam ...

  8. Android Studio 插件(plugins)或者intellij idea 插件(plugins)无法安装

    通常这种情况出现都因为idea.properties修改了 idea.system.path=${指定路径}/system idea.plugins.path=${idea.config.path}/ ...

  9. Gradle 的下载安装配置以及创建第一个Gradle 项目

    1. 什么是Gradle? Gradle是一个开源的构建自动化工具,专注于灵活性和性能. Gradle构建脚本使用Groovy或Kotlin DSL编写. 阅读Gradle功能,了解Gradle的功能 ...

  10. Django登陆以后重定向到请求登陆的页面

    登陆和注销操作在网页编程上很常见,这两个操作经常需要在操作成功以后转入发出请求的页面. 比如用户正在浏览一篇文章,发现下载该文章的附件需要登录才能进行,这时候点击登陆链接转入登陆页面,输入用户名密码登 ...