锁机制,信号量机制,事件机制

IPC -- inter process Communication  进程间通信

守护进程随着父进程的代码执行完毕才结束  代码:from multiprocessing import Processimport time

def func1():    for i in range(65,90):        print(chr(i))        time.sleep(0.5)

def func():    for i in range(10):        print(i)        time.sleep(0.5)

if __name__ == ‘__main__‘:    p = Process(target=func)    p.start()    p1 = Process(target=func1)    p1.daemon = True    p1.start()    time.sleep(2)

锁机制:

l = Lock()
        一把锁配一把钥匙
        拿钥匙,锁门  l.acquire()
        还钥匙,开门  l.release()
  模拟12306  代码:

from multiprocessing import Process,Lockimport time

def check(i):    with open(‘余票‘) as f:        con = f.read()    print(‘第%s个人查到余票还剩%s张‘%(i,con))

def buy_ticket(i,l):    l.acquire()# 拿钥匙,锁门    with open(‘余票‘) as f:        con = int(f.read())        time.sleep(0.1)    if con > 0:        print(‘\033[31m 第%s个人买到票了\033[0m‘%i)        con -= 1    else:        print(‘\033[32m 第%s个人没有买到票\033[0m‘%i)    time.sleep(0.1)# 是指 买完票后,把余票数量重写写入数据库的时间延迟    with open(‘余票‘,‘w‘) as f:        f.write(str(con))    l.release()# 还钥匙,开门

if __name__ == ‘__main__‘:    l = Lock()    for i in range(10):        p_ch = Process(target=check,args=(i+1,))        p_ch.start()    for i in range(10):        p_buy = Process(target=buy_ticket,args=(i+1,l))        p_buy.start()

解决父子 进程共享问题代码 :用 Value模块
from multiprocessing import Process,Value,Lockimport time

def get_money(num,l):# 取钱    l.acquire()# 拿走钥匙,锁上门,不允许其他人进屋    for i in range(100):        num.value -= 1        print(num.value)        time.sleep(0.01)    l.release()# 还钥匙,打开门,允许其他人进屋

def put_money(num,l):# 存钱    l.acquire()    for i in range(100):        num.value += 1        print(num.value)        time.sleep(0.01)    l.release()

if __name__ == ‘__main__‘:    num = Value(‘i‘,100)    l = Lock()    p = Process(target=get_money,args=(num,l))    p.start()    p1 = Process(target=put_money, args=(num,l))    p1.start()    p.join()    p1.join()    print(num.value)
 

信号机制

sem = Semaphore(n)
        n : 是指初始化一把锁配几把钥匙,一个int型
        拿钥匙,锁门  l.acquire()
        还钥匙,开门  l.release()
        信号量机制比锁机制多了一个计数器,这个计数器是用来记录当前剩余几把钥匙的。
        当计数器为0时,表示没有钥匙了,此时acquire()处于阻塞。
        对于计数器来说,每acquire一次,计数器内部就减1,release一次,计数器就加1

 发廊代码:

from multiprocessing import Process,Semaphoreimport timeimport random

def func(i,sem):    sem.acquire()    print(‘第%s个人进入小黑屋,拿了钥匙锁上门‘ % i)    time.sleep(random.randint(3,5))    print(‘第%s个人出去小黑屋,还了钥匙打开门‘ % i)    sem.release()

if __name__ == ‘__main__‘:    sem = Semaphore(5)# 初始化了一把锁5把钥匙,也就是说允许5个人同时进入小黑屋    # 之后其他人必须等待,等有人从小黑屋出来,还了钥匙,才能允许后边的人进入    for i in range(20):        p = Process(target=func,args=(i,sem,))        p.start()

事件机制
        e = Event()
        # e.set()    #将is_set()设为True
        # e.clear()  # 将is_set()设为False
        # e.wait()   #判断is_set的bool值,如果bool为True,则非阻塞,bool值为False,则阻塞
        # e.is_set() # 标识
        # 事件是通过is_set()的bool值,去标识e.wait() 的阻塞状态
        # 当is_set()的bool值为False时,e.wait()是阻塞状态
        # 当is_set()的bool值为True时,e.wait()是非阻塞状态
        # 当使用set()时,是把is_set的bool变为True
        # 当使用clear()时,是把is_set的bool变为False

信号灯代码:

from multiprocessing import Process,Eventimport time

def tra(e):    ‘‘‘信号灯函数‘‘‘    e.set()    print(‘\033[32m 绿灯亮! \033[0m‘)    while 1:# 红绿灯得一直亮着,要么是红灯要么是绿灯        if e.is_set():# True,代表绿灯亮,那么此时代表可以过车            time.sleep(5)# 所以在这让灯等5秒钟,这段时间让车过            print(‘\033[31m 红灯亮! \033[0m‘)# 绿灯亮了5秒后应该提示到红灯亮            e.clear()# 把is_set设置为False        else:            time.sleep(5)# 此时代表红灯亮了,此时应该红灯亮5秒,在此等5秒            print(‘\033[32m 绿灯亮! \033[0m‘)# 红的亮够5秒后,该绿灯亮了            e.set()# 将is_set设置为True

def Car(i,e):    e.wait()# 车等在红绿灯,此时要看是红灯还是绿灯,如果is_set为True就是绿灯,此时可以过车    print(‘第%s辆车过去了‘%i)

if __name__ == ‘__main__‘:    e = Event()    triff_light = Process(target=tra,args=(e,))# 信号灯的进程    triff_light.start()    for i in range(50):# 描述50辆车的进程        if i % 3 == 0:            time.sleep(2)        car = Process(

原文地址:https://www.cnblogs.com/xdlzs/p/9513342.html

时间: 2024-07-30 23:07:43

锁机制,信号量机制,事件机制的相关文章

【Python下进程同步之互斥锁、信号量、事件机制】 -- 2019-08-16 17:58:28

原文: http://blog.gqylpy.com/gqy/229 " 一.锁机制:??multiprocess.Lock 上篇博客中,我们千方百计实现了程序的异步,让多个任务同时在几个进程中并发处理,但它们之间的运行没有顺序.尽管并发编程让我们能更加充分的利用io资源,但是也给我我们带来了新问题,多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题. 例: # 多进程抢占输出资源 from multiprocessing import Process from os import

【Python下进程同步之互斥锁、信号量、事件机制】 𪕽

原文: http://blog.gqylpy.com/gqy/229 " 一.锁机制:??multiprocess.Lock 上篇博客中,我们千方百计实现了程序的异步,让多个任务同时在几个进程中并发处理,但它们之间的运行没有顺序.尽管并发编程让我们能更加充分的利用io资源,但是也给我我们带来了新问题,多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题. 例: # 多进程抢占输出资源 from multiprocessing import Process from os import

Unity事件处理机制与NGUI事件机制

1 Unity原生 1.1 GUI void OnGUI(){ if(GUI.Button(Rect position, string text)){ //点击后立即执行 } 1.1 Input 每个手指触控是通过Input.touches数据结构描述的: fingerId 手指索引 The unique index for a touch. 触摸的唯一索引. position 位置 The screen position of the touch. 触摸屏幕的位置. deltaPosition

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

一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例子 #并发运行,效率高,但竞争同一打印终端,带来了打印错乱 from multiprocessing import Process import os,time def work(): print('%s is running' %os.getpid()) time.sleep(2) print('

线程--守护线程、线程锁、信号量、事件、条件、定时器、队列、池(三)

守护线程 import timefrom threading import Threaddef func1(): while True: print('*'*10) time.sleep(1)def func2(): print('in func2') time.sleep(5) t = Thread(target=func1,)t.daemon = Truet.start()t2 = Thread(target=func2,)t2.start()t2.join() #加join后会等待func

Qt事件机制概览

Qt事件机制概览 Qt事件机制概览 消息循环 Qt事件循环 简介 QEventLoop 跨线程的信号和槽与事件循环 模态窗口 Native widget or Alien widget 创建Native widget 创建QApplication的message-only窗口 派发事件的公共基础方法 source code QApplication的创建过程 QWidget native QWidget 的创建过程 普通native widget回调过程 QApplication的message

PHP event 事件机制

PHP event 事件机制 <?php /* * PHP 事件机制 */ class baseClass{ private $_e; public function __set($name,$value){ if( strncasecmp($name,"on",2) === 0 ){ if(!isset($this->_e[$name])) $this->_e[$name] = array(); return array_push($this->_e[$nam

详解C#事件机制

C#中的委托事件机制是这种语言的一大亮点,以一种更加安全和高效的方式可以实现类似C语言中的函数指针,Qt中的信号槽机制和委托事件机制在实际运用中颇为相似,但是,C#使用上更加方便.下面,我先贴个图来展示一个事件机制的原理: 上述Publisher类的作用就是定义委托.定义事件以及定义触发事件的方法: Subscriber类的作用注册事件,并且定义具体的事件处理方法.(好像Subscriber类不需要注册事件,注册事件是在运行的模块进行) 这种思想本人以为就是:还没想好怎么做就先搭个框架(写个函数

锁机制---信号机制----事件机制

锁机制 防止数据混乱 , 保护对进程的数据安全性 锁涉及两个操作: 拿钥匙锁门  -------   不让别人进屋   (  其它 进程若想 进屋  要在外边等待 ,  等其出来后还回钥匙,才能进去  ) 还钥匙 开门 -------  让别人进屋 from  multiprocessing  import  Lock    先要导入模块 l = Lock()     实例化一个锁机制  即对象锁     不用传参数     这把锁只有一把钥匙 l.acquire()      锁门    拿走