zoukankan      html  css  js  c++  java
  • 039条件变量同步(Condition)

    也是锁,这个锁多加了wait(),notify()唤醒一个进程,notifyall()唤醒全部进程方法,创建的时候默认是Rlock类型的锁,可以设置为lock类型的,默认就ok

     1 from random import randint
     2 import threading
     3 import time
     4 
     5 class Producer(threading.Thread):
     6     def run(self):
     7         global L
     8         while True:
     9             val = randint(0,100)
    10             print('生产者',self.name,':append',str(val),L)
    11             if lock_con.acquire():
    12                 L.append(val)
    13                 lock_con.notify()
    14                 lock_con.release()
    15             time.sleep(3)
    16 
    17 class Consumer(threading.Thread):
    18     def run(self):
    19         global  L
    20         while True:
    21             lock_con.acquire()
    22             if len(L) == 0:
    23                 lock_con.wait()
    24             print('消费者',self.name,'delete',str(L[0]),L)
    25             del L[0]
    26             lock_con.release()
    27         time.sleep(0.5)
    28 
    29 if __name__ == '__main__':
    30     L = []
    31     lock_con = threading.Condition()
    32     threads = []
    33     for i in range(5):
    34         threads.append(Producer())
    35         threads.append(Consumer())
    36     for t in threads:
    37         t.start()
    38     for t in threads:
    39         t.join()
    使用例子

    ###########java改编:单生产单消费

     1 import time
     2 import threading
     3 
     4 class Res:
     5     def __init__(self):
     6         self.flag = False
     7         self.count = 0
     8         self.product = ''
     9 
    10     def set(self,name):
    11         lock_con.acquire()
    12         if self.flag:
    13             lock_con.wait()
    14         time.sleep(0.00001)
    15         self.count += 1
    16         self.product = ''.join([name,'**',str(self.count)])
    17         self.message = ''.join([self.product,'__生产者__',str(threading.current_thread())])
    18         print(self.message)
    19         self.flag = True
    20         lock_con.notify()
    21         lock_con.release()
    22 
    23     def get_product(self):
    24         lock_con.acquire()
    25         time.sleep(0.00001)
    26         if not self.flag:
    27             lock_con.wait()
    28         self.message = ''.join([self.product,'__消费者__',str(threading.current_thread())])
    29         print(self.message)
    30         self.flag = False
    31         lock_con.notify()
    32         lock_con.release()
    33 
    34 class Producer(threading.Thread):
    35     def __init__(self,r):
    36         threading.Thread.__init__(self)
    37         self.r = r
    38 
    39     def run(self):
    40         for i in range(100):
    41             self.r.set('大白兔奶糖')
    42 
    43 class Consumer(threading.Thread):
    44     def __init__(self,r):
    45         threading.Thread.__init__(self)
    46         self.r = r
    47 
    48     def run(self):
    49         for i in range(100):
    50             self.r.get_product()
    51 
    52 if __name__ == '__main__':
    53     lock_con = threading.Condition()
    54     r = Res()
    55     c = Consumer(r)
    56     p = Producer(r)
    57     c.start()
    58     p.start()
    单生产单消费

    ############多生产多消费

     1 import time
     2 import threading
     3 
     4 class Res:
     5     def __init__(self):
     6         self.flag = False
     7         self.count = 0
     8         self.product = ''
     9 
    10     def set(self,name):
    11         lock_con.acquire()
    12         while self.flag:
    13             lock_con.wait()
    14         time.sleep(0.00001)
    15         self.count += 1
    16         self.product = ''.join([name,'**',str(self.count)])
    17         self.message = ''.join([self.product,'__生产者__',str(threading.current_thread())])
    18         print(self.message)
    19         self.flag = True
    20         lock_con.notifyAll()
    21         lock_con.release()
    22 
    23     def get_product(self):
    24         lock_con.acquire()
    25         time.sleep(0.00001)
    26         while not self.flag:
    27             lock_con.wait()
    28         self.message = ''.join([self.product,'__消费者__',str(threading.current_thread())])
    29         print(self.message)
    30         self.flag = False
    31         lock_con.notifyAll()
    32         lock_con.release()
    33 
    34 class Producer(threading.Thread):
    35     def __init__(self,r):
    36         threading.Thread.__init__(self)
    37         self.r = r
    38 
    39     def run(self):
    40         for i in range(100):
    41             self.r.set('大白兔奶糖')
    42 
    43 class Consumer(threading.Thread):
    44     def __init__(self,r):
    45         threading.Thread.__init__(self)
    46         self.r = r
    47 
    48     def run(self):
    49         for i in range(100):
    50             self.r.get_product()
    51 
    52 if __name__ == '__main__':
    53     lock_con = threading.Condition()
    54     r = Res()
    55     l = []
    56     for i in range(5):
    57         l.append(Consumer(r))
    58     for i in range(5):
    59         l.append(Producer(r))
    60     for a in l:
    61         a.start()
    多生产多消费

    个人觉得例子理解是最好的,所以我学的东西一般使用例子

  • 相关阅读:
    WEB前端开发工具的初识
    Linux常见问题的处理方法(长期更新)
    eclipse+tomcat开发web项目
    Android适配--百分比的适配
    TCP通信丢包原因总结
    android 实现类似微信缓存和即时更新好友头像
    是否应该开启WebView硬件加速?
    Android通过浏览器打开app页面并且传递值
    设计模式(五)责任链模式
    Android 最新 Support V4 包大拆分有用吗?
  • 原文地址:https://www.cnblogs.com/-nbloser/p/8539286.html
Copyright © 2011-2022 走看看