• Python中的锁


    先用thread模块的Lock锁来实现生产者消费者问题,

    Lock对象是Python提供的低级线程控制工具,使用起来非常简单,只需下面3条语句即可:

    thread.allocate_lock() 返回一个新Lock对象,即为一个新锁
    lock.acquire() 相当于P操作,得到一个锁
    lock.release() 相当于V操作,释放一个锁
    lock.locked() 已经得到了锁,返回True(一般用不到)
     1 import thread,time,random  
     2 dish = 0 #需要放在安全区的变量
     3 lock = thread.allocate_lock ()
     4 def producerFunction() :
     5     '''如果投的筛子比0.2大,则向盘子中增加一个苹果'''
     6     global lock, dish
     7     while True:
     8         if ( random.random() > 0.1 ):
     9             lock.acquire() # 从这里进入线程安全区
    10             if dish < 100:
    11                 dish += 1
    12                 msg = '生产者增加了一个苹果,现在有 %d 个苹果' % (dish)
    13                 print ( msg.decode ('utf-8') )
    14             lock.release() # 从这里离开线程安全区
    15         time.sleep (random.random()*3)
    16 
    17 def consumerFunction() :
    18     '''如果投的筛子比0.5大,则从盘子中取一个苹果'''  
    19     global lock, dish  
    20     while True:  
    21         if ( random.random() > 0.9 ):
    22             lock.acquire() # 从这里进入线程安全区
    23             if dish > 0:
    24                 dish -= 1
    25                 msg = '消费者拿走一个苹果现,在有%d个苹果' % (dish)
    26                 print (msg.decode('utf-8'))
    27             lock.release() # 从这里离开线程安全区
    28             time.sleep (random.random()*3)  
    29   
    30 def begin_test_lock():
    31     ident1 = thread.start_new_thread ( producerFunction, () )
    32     ident2 = thread.start_new_thread ( consumerFunction, () )
    33     time.sleep(60)
    34 def main ():
    35     begin_test_lock ()
    36 if __name__ == '__main__' :
    37     main ()
  • 相关阅读:
    【转】Foreach用法
    【转】PB实现在通知区域添加图标
    手动清理SQLSERVER的日志文件
    2012腾讯实习笔试
    触控(捕鱼达人)笔试
    C和指针第五章操作符和表达式
    浮点数的存储
    C和指针第三章数据
    动态规划
    有关海量数据处理
  • 原文地址:https://www.cnblogs.com/mmix2009/p/3223333.html
Copyright © 2020-2023  润新知