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. Linux及Arm-Linux程序开发笔记(零基础入门篇)

    Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/bee ...

  2. 【ZH奶酪】如何用sklearn计算中文文本TF-IDF?

    1. 什么是TF-IDF tf-idf(英语:term frequency–inverse document frequency)是一种用于信息检索与文本挖掘的常用加权技术.tf-idf是一种统计方法 ...

  3. 理顺FFT

    DFT(Discrete Fourier Transform):离散傅立叶变换 直观的计算DFT算法复杂度为O(N*N). FFT(Fast Fourier Transformation):快速傅立叶 ...

  4. eclipse开发android入门学习

    1.device窗体            查看android执行情况的窗体和DDMS内容一致 2.android.bat             在adb路径下执行adb操作,实现android系统 ...

  5. Socket网络编程--小小网盘程序(4)

    在这一小节中实现了文件的下载,具体的思路是根据用户的uid和用户提供的文件名filename联合两张表,取得md5唯一标识符,然后操作这个标识符对应的文件发送给客户端. 实现下载的小小网盘程序 cli ...

  6. JAVA(四)类集/枚举

    成鹏致远 | lcw.cnblog.com |2014-02-04 JAVA类集 1.认识类集 类集的作用 类集实际上就是一个动态的对象数组,与一般的对象数组不同,类集中的对象内容可以任意扩充 类集的 ...

  7. 基于Docker的redis集群搭建

    Redis集群官方介绍:http://www.redis.cn/topics/cluster-tutorial.html 基于Docker搭建Redis集群 环境:6个节点,三主三从 制作Redis镜 ...

  8. [转] BootStrap table增加一列显示序号

    原文地址:https://blog.csdn.net/aboboo5200/article/details/78839208 最近由于项目需要,使用BootStrap table做数据展示,其中要在第 ...

  9. 【Unity】讯飞语音识别SDK

    1.进入讯飞官网,注册帐号,进入控制台,创建新应用UnityXunfeiDemo,平台选Android.在当前应用这点下载SDK,添加AI能力(添加新服务),选择语音听写,即可下载安卓SDK(下称讯飞 ...

  10. 命名实体识别,使用pyltp提取文本中的地址

    首先安装pyltp pytlp项目首页 单例类(第一次调用时加载模型) class Singleton(object): def __new__(cls, *args, **kwargs): if n ...