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. Intellij IDEA 通过数据库表逆向生成带注释的实体类文件超级详细步骤,附详细解决方案

    参考:https://blog.csdn.net/qq_34371461/article/details/80571281  https://blog.csdn.net/mqchenrong/arti ...

  2. Effective C++ 条款46

    本节条款:须要类型转换时请为模板定义非成员函数 这节知识是在条款24的基础上,讲述的有关非成员函数在模板类中(non-member function template)的作用. 我们先看一下条款24讲 ...

  3. SSE图像算法优化系列四:图像转置的SSE优化(支持8位、24位、32位),提速4-6倍

    一.前言 转置操作在很多算法上都有着广泛的应用,在数学上矩阵转置更有着特殊的意义.而在图像处理上,如果说图像数据本身的转置,除了显示外,本身并无特殊含义,但是在某些情况下,确能有效的提高算法效率,比如 ...

  4. JMX-Java Management Extensions

    JMX全称Java Management Extensions, 为Java应用提供管理扩展功能.在Java 5的时候引入 概念 Name Description MBean 全称为Managed B ...

  5. 阿里云logtail采集IDC机房机器需添加AliUids操作

    Configure AliUids for ECS servers under other Alibaba Cloud accounts or on-premises IDCs If Logtail ...

  6. 11g新特性 -- Virtual Private Catalogs

    在oracle 11g之前版本中,如果用户只是需要访问recovery catalog 中的某个数据库,但是我们却只能将整个recovery catalog授权给他,无法做到严格限制. 现在,virt ...

  7. [svc]linux上vxlan实战

    linux vxlan实现2台机器的通往段ip互通 - 在n1上 ip l a vxlan0 type vxlan id 42 dstport 4789 remote 192.168.1.12 loc ...

  8. linux tcp相关参数

    /etc/sysctl.conf文件 /etc/sysctl.conf是一个允许你改变正在运行中的Linux系统的接口.它包含一些TCP/IP堆栈和虚拟内存系统的高级选项,可用来控制Linux网络配置 ...

  9. Xbox One手柄 + Xbox Wireless Adapter PC无线适配器驱动安装、配对全流程

    以下步骤在Windows 7系统中操作.XBox One手柄+无线适配器并非仅只能在Windows 10中使用. 一点感想:微软的XBoxOne手柄实在是好东西,但产品使用说明与文档实在太垃圾,翻遍官 ...

  10. 【GMT43智能液晶模块】例程二:串口通信实验

    实验原理: GMT43智能液晶模块的串口包括USB_UART(CH340),TTL,RS-232,RS-485/ RS-422等四部分,USB_UART部分通过CH340芯片与STM32F429的US ...