Python的条件锁与事件共享

系统 1684 0

1:事件机制共享队列:

利用消息机制在两个队列中,通过传递消息,实现可以控制的生产者消费者问题
要求:readthread读时,writethread不能写;writethread写时,readthread不能读。
基本方法 时间类(Event)
·set:设置事件。将标志位设为True。
wait:等待事件。会将当前线程阻塞,直到标志位变为True。
clear:清除事件。将标志位设为False。
set() clear() 函数的交替执行 也就是消息传递的本质

          

模版:
            
              基本code
# 事件消息机制
import queue
import threading
import random

            
            
              from
            
            
               threading import Event

            
            
              from
            
            
               threading import Thread

            
            
              class
            
            
               WriteThread(Thread):
    def __init__(self,q,wt,rt):
        super().__init__();
        self.queue
            
            =
            
              q;
        self.rt
            
            =
            
              rt;
        self.wt
            
            =
            
              wt;
   def  run(self):
         self.rt.
            
            
              set
            
            
              ()
         
         self.wt.wait();
         self.wt.clear();
         

            
            
              class
            
            
               ReadThread(Thread):
    def __init__(self,q,wt,rt):
        super().__init__();
        self.queue
            
            =
            
              q;
        self.rt
            
            =
            
              rt;
        self.wt
            
            =
            
              wt;    
     def run(self):
          
            
            
              while
            
            
               True:
             self.rt.wait();
             self.wt.wait();
             self.wt.clear()
            
          

 

参考代码:

            
              #
            
            
               -*- coding: utf-8 -*-
            
            
              """
            
            
              
Created on Tue Sep 10 20:10:10 2019

@author: DGW-PC

            
            
              """
            
            
              #
            
            
               事件消息机制
            
            
              import
            
            
               queue

            
            
              import
            
            
               threading

            
            
              import
            
            
               random

            
            
              from
            
             threading 
            
              import
            
            
               Event

            
            
              from
            
             threading 
            
              import
            
            
               Thread


            
            
              class
            
            
               WriteThread(Thread):
    
            
            
              def
            
            
              __init__
            
            
              (self,q,wt,rt):
        super().
            
            
              __init__
            
            
              ();
        self.queue
            
            =
            
              q;
        self.rt
            
            =
            
              rt;
        self.wt
            
            =
            
              wt;
    
            
            
              def
            
            
               run(self):
        data
            
            =[random.randint(1,100) 
            
              for
            
             _ 
            
              in
            
             range(0,10
            
              )];
        self.queue.put(data);
        
            
            
              print
            
            (
            
              "
            
            
              WriteThread写队列:
            
            
              "
            
            
              ,data);
        self.rt.set(); 
            
            
              #
            
            
               发送读事件
            
            
              print
            
            (
            
              "
            
            
              WriteThread通知读
            
            
              "
            
            
              );
        
            
            
              print
            
            (
            
              "
            
            
              WriteThread等待写
            
            
              "
            
            
              );
        self.wt.wait();
        
            
            
              print
            
            (
            
              "
            
            
              WriteThread收到写事件
            
            
              "
            
            
              );
        self.wt.clear();
        
            
            6

            
              class
            
            
               ReadThread(Thread):
    
            
            
              def
            
            
              __init__
            
            
              (self,q,wt,rt):
        super().
            
            
              __init__
            
            
              ();
        self.queue
            
            =
            
              q;
        self.rt
            
            =
            
              rt;
        self.wt
            
            =
            
              wt;
    
            
            
              def
            
            
               run(self):
        
            
            
              while
            
            
               True:
            self.rt.wait();
            
            
              #
            
            
               等待写事件 带来
            
            
              print
            
            (
            
              "
            
            
              ReadThread 收到读事件
            
            
              "
            
            
              );
            
            
            
              print
            
            (
            
              "
            
            
              ReadThread 开始读{0}
            
            
              "
            
            
              .format(self.queue.get()));
            
            
            
              print
            
            (
            
              "
            
            
              ReadThread 发送写事件
            
            
              "
            
            
              );
            self.wt.set();
            self.rt.clear();
q
            
            =
            
              queue.Queue();
rt
            
            =
            
              Event();
wt
            
            =
            
              Event();
writethread
            
            =WriteThread(q,wt,rt); 
            
              #
            
            
               实例化对象的
            
            
readthread=ReadThread(q,wt,rt);   
            
              #
            
            
               实例化对象的
            
            
              
writethread.start();
readthread.start();
            
          

 



2:条件锁同步生产者消费者

作用: 在保护互斥资源的基础上,增加了条件判断的机制
即为使用wait() 函数 判断不满足当前条件的基础上,让当前线程的阻塞。
其他线程如果生成了满足了条件的资源 使用notify() notifyALl() 函数将刮起线程唤醒。
使用了 threading 的Condition 类
acquire() : 锁住当前资源
relarse() :释放当前锁住的资源
wait:挂起当前线程, 等待唤起 。
• notify:唤起被 wait 函数挂起的线程 。
• notif计All:唤起所有线程,防止线程永远处于沉默状态 。

 
模版:

            
              基本code

            
            
              from
            
            
               threading import Thread

            
            
              from
            
            
               threading import Condition
import random
import time

            
            
              lock
            
            =
            
              Condition(); # 声明条件锁
flag
            
            =
            
              0
            
            
              ;
def cnsumer():
    
            
            
              lock
            
            
              .acquire();
    
            
            
              while
            
             flag==
            
              0
            
            
              :
        
            
            
              lock
            
            
              .wait();
   
   业务代码
            
            ---        

            
              lock
            
            
              .relarse();
      
def product():
    
            
            
              lock
            
            
              .acquire();
    
    释放锁之前对控制变量进行操作,数据的操作控制 可以作为全局变量来锁定
    
            
            
              lock
            
            
              .notifyALl();
    
            
            
              lock
            
            .relarse();
            



 

 

 参考代码code:

            
              #
            
            
               -*- coding: utf-8 -*-
            
            
              """
            
            
              
Created on Wed Sep 11 21:40:41 2019

@author: DGW-PC

            
            
              """
            
            
              #
            
            
               条件锁生产者消费者
            
            
              from
            
             threading 
            
              import
            
            
               Thread

            
            
              from
            
             threading 
            
              import
            
            
               Condition

            
            
              import
            
            
               random

            
            
              import
            
            
               time

flag
            
            =0; 
            
              #
            
            
               声明控制标志
            
            
goods=0; 
            
              #
            
            
               事物表示
            
            
lock=
            
              Condition();

            
            
              def
            
            
               consumer(x):
    
            
            
              global
            
            
               flag;
    
            
            
              global
            
            
               goods;
    lock.acquire(); 
            
            
              #
            
            
               取得锁
            
            
              while
            
             flag==0: 
            
              #
            
            
               便于多次进行消费
            
            
              print
            
            (
            
              "
            
            
              consumer %d进入等待
            
            
              "
            
             %
            
               x);
         lock.wait();
    
            
            
              print
            
            (
            
              "
            
            
              consumer {0}:消费了{1}
            
            
              "
            
            .format(x,goods));
            
              #
            
            
               format 次序从0开始
            
            
    flag-=1
            
              ;
    lock.release(); 
            
            
              #
            
            
              释放锁
            
            
              def
            
            
               product(x):
    
            
            
              global
            
            
               flag;
    
            
            
              global
            
            
               goods;
    time.sleep(
            
            3
            
              );
    lock.acquire();
    goods
            
            =random.randint(1,1000
            
              );
    
            
            
              print
            
            (
            
              "
            
            
              product {0} 产生了{1}
            
            
              "
            
            
              .format(x,goods));
    flag
            
            +=1
            
              ;
    lock.notifyAll();
    lock.release();

threads
            
            =
            
              [];


            
            
              for
            
             i 
            
              in
            
             range(0,2
            
              ):
    t1
            
            =Thread(target=consumer,args=
            
              (i,));
    t2
            
            =Thread(target=product,args=
            
              (i,));
    t1.start();
    t2.start();
    threads.append(t1);
    threads.append(t2);


            
            
              for
            
             x 
            
              in
            
            
               threads:
    x.join();
    
            
          

 


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论