信号量

from multiprocessing import Process
from multiprocessing import Semaphore
import time
import random
def ktv(i,sem):
sem.acquire()
print('%s走进ktv'%i)
time.sleep(random.randint(1,5))
print('%s走出ktv'%i)
sem.release()
if __name__ == '__main__':
sem = Semaphore(4)
for i in range(20):
p = Process(target=ktv,args=(i,sem))
p.start()

事件

from multiprocessing import Event
# 一个信号可以使得所有的进程都进入阻塞状态
# 也可以控制所有的进程解除阻塞
# 一个事件被创建之后,默认是阻塞状态
e = Event() #创建一个事件
print(e.is_set()) #查看一个事件的状态,默认被设置为阻塞
print(12345)
e.set() #将这个事件的状态改为true
print(e.is_set()) #查看一个事件的状态,默认被设置为阻塞
e.wait() #是依据e.is_set()的值来决定是否阻塞
print(12345677)
e.clear() #将这个事件的状态改为False
e.wait() #是依据e.is_set()的值来决定是否阻塞
print('###############3')
set 和 clear:分别用来修改一个事件的状态。True或False
# is_set 用来查看一个事件的状态
# wait 是依据事件的状态来决定自己是否阻塞 False是阻塞。True是不阻塞
# 红绿灯事件
from multiprocessing import Event
from multiprocessing import Process
import random
import time
def cars(e,i):
if not e.is_set():
print('car%i在等等'%i)
e.wait() #阻塞直到得到一个事件状态,事件状态改变成true的信号
print('car%i通过'%i)
'车通行'
def light(e):
while True:
if e.is_set():
e.clear()
print('\033[31m红灯亮了\33[0m')
else:
e.set()
print('\033[32m绿灯亮了\33[0m')
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())
队列  先进先出
# IPC(Inter-Process Communication)---队列
# 创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。
from multiprocessing import Queue
import time
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.empty())
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 Queue,Process
def produce(q):
q.put('hello')
def consume(q):
q.get()
if __name__ == '__main__':
q = Queue()
p = Process(target=produce,args=(q,))
p.start()
c = Process(target=produce,args=(q,))
c.start()
print(q.get())
# 生产者消费者模型
from multiprocessing import Process,Queue
import time
import random
def consumer(q,name):
while True:
food = q.get()
if food is None:
print('%s获取到了一个空'%name)
break
print('\033[31m%s消费了%s\033[0m' %(name,food))
time.sleep(random.randint(1,3)) def producer(name,food,q):
for i in range(4):
time.sleep(random.randint(1,3))
f = '%s生成了%s%s'%(name,food,i)
print(f)
q.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=(q,'alex'))
c2 = Process(target=consumer,args=(q,'jin'))
p1.start()
p2.start()
c1.start()
c2.start()
p1.join()
p2.join()
q.put(None)
q.put(None)
# JoinableQueue
# 在消费者这一端:
# 每次获取一个数据
# 处理一个数据
# 发送一个记号 :标志一个数据被处理成功
# 在生产者这一端:
# 每一次生产一个数据
# 且每一次生产的数据都放在对列中
# 在队列中刻上了一个记号
# 当生产者全部生产完毕之后
# join信号:已经停止生产数据了,且要等待之前被刻上的记号被消费完
# 当数据都被处理完的时候,join阻塞结束
# consumer 中把所有的任务都消耗完
# producer端的join感知到,停止阻塞
# 所有的producer进程结束
# 主进程中的p.join结束
# 主进程代码结束
# 守护进程(消费者进程)结束
from multiprocessing import Process,JoinableQueue
import time
import random
def consumer(q,name):
while True:
food = q.get()
if food is None:
print('%s获取到了一个空'%name)
break
print('\033[31m%s消费了%s\033[0m' %(name,food))
time.sleep(random.randint(1,3))
q.task_done() #count-1 def producer(name,food,q):
for i in range(4):
time.sleep(random.randint(1,3))
f = '%s生成了%s%s'%(name,food,i)
print(f)
q.put(f)
q,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=(q,'alex'))
c2 = Process(target=consumer,args=(q,'jin'))
p1.start()
p2.start()
c1.daemon = True #设置为守护进程,主进程中的代码执行完毕之后子进程自动结束
c2.daemon = True
c1.start()
c2.start()
p1.join() #感知一个进程的结束
p2.join()

Python9-事件及队列-day37的更多相关文章

  1. Python学习之路并发编程--信号量、事件、队列及生产消费模型

    1. 信号量 对于多进程来说,多个进程同时修改数据,就可能出现安全隐患,所以引入了锁,这一机制,但锁只能有一把来控制一个的开关,当你需要几把锁的时候,就可能用到信号量的概念.他是用了锁的原理,内置了一 ...

  2. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  3. Python_守护进程、锁、信号量、事件、队列

    1.创建进程 守护进程(*****) _.daemon = True #  _进程成为守护进程 守护进程也是一个子进程. 主进程的<代码>执行结束之后守护进程自动结束. import ti ...

  4. python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))

    昨日内容回顾 python中启动子进程并发编程并发 :多段程序看起来是同时运行的ftp 网盘不支持并发socketserver 多进程 并发异步 两个进程 分别做不同的事情 创建新进程join :阻塞 ...

  5. 线程、进程、daemon、GIL锁、线程锁、递归锁、信号量、计时器、事件、队列、多进程

    # 本文代码基于Python3 什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行 ...

  6. Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet

    主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import ...

  7. Python全栈开发-Day9-线程/GIL/事件/队列

    本节内容 进程与线程的概念 Python threading 模块 GIL——global interpreter lock Mutex互斥锁(线程锁) Semaphore信号量 Events事件 Q ...

  8. SQL Server 事件通知(Event notifications)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 事件通知监控DDL(NotifyQue ...

  9. jQuery-1.9.1源码分析系列(十) 事件系统——事件体系结构

    又是一个重磅功能点. 在分析源码之前分析一下体系结构,有助于源码理解.实际上在jQuery出现之前,Dean Edwards的跨浏览器AddEvent()设计做的已经比较优秀了:而且jQuery事件系 ...

随机推荐

  1. Web自动化测试—PO设计模式(一)

    前言 很多的测试同学懂得使用selenium进行Web自动化测试, 但是不知道如何去写一个测试框架,或者说是一个容易维护的web自动化项目. 自己写一个最基本的web自动化测试框架需要会什么? 1. ...

  2. CSS3 - CheakBox 开关效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. JVM垃圾回收机制四

    GCRoots与可达性分析 Java中的四种引用 强引用.软引用.弱引用.虚引用.这四种引用的强度是逐渐减弱的,JVM垃圾回收的力度是逐渐增强的. 四种引用的作用 1.可以让程序员通过代码来控制对象的 ...

  4. ribbon重试机制

    我们使用Spring Cloud Ribbon实现客户端负载均衡的时候,通常都会利用@LoadBalanced来让RestTemplate具备客户端负载功能,从而实现面向服务名的接口访问. 下面的例子 ...

  5. js push(),pop(),shift(),unshift()

    以前没有太在意这些,这几天看<Javascript 设计模式与开发实践>(不得不说这是一本好书) 发现总是会用到这几个函数,可是有什么区别呢?? 简单来说是两套东西(数据结构时老师详细的讲 ...

  6. 兼容IE9以下的获取兄弟节点

    function fileCheck(ele){ function getNextElement(node){ //兼容IE9以下的 获取兄弟节点 var NextElementNode = node ...

  7. zTree使用随笔

    最近开发过程中,需要写一个公司人员组织架构的树状图,后来选用了依赖jQuery的zTree插件来实现,主要是该插件功能齐全,性能稳定,个性化编辑方便,遂选用了这个插件.我记录了一下根据自身需求定制化修 ...

  8. C#调用C++接口返回字符串的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 现在有这样一种情景,假如C#调用C++接口需要返回一个字符串.因为字符串是不定长的,因此传递一个定长的字符串进去是不合 ...

  9. 如何在Sierra运行 Specials K 的patch

    https://github.com/ApolloZhu/CORE-Keygen-and-Special-K-for-Sierra-Utility/blob/master/Special%20K%20 ...

  10. 2015 ACM/ICPC Asia Regional Changchun Online Pro 1005 Travel (Krsukal变形)

    Travel Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Su ...