<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        舉例講解Python編程中對線程鎖的使用

        來源:懂視網 責編:小采 時間:2020-11-27 14:28:59
        文檔

        舉例講解Python編程中對線程鎖的使用

        舉例講解Python編程中對線程鎖的使用:鎖 python的內置數據結構比如列表和字典等是線程安全的,但是簡單數據類型比如整數和浮點數則不是線程安全的,要這些簡單數據類型的通過操作,就需要使用鎖。 #!/usr/bin/env python3 # coding=utf-8 import threading shared_res
        推薦度:
        導讀舉例講解Python編程中對線程鎖的使用:鎖 python的內置數據結構比如列表和字典等是線程安全的,但是簡單數據類型比如整數和浮點數則不是線程安全的,要這些簡單數據類型的通過操作,就需要使用鎖。 #!/usr/bin/env python3 # coding=utf-8 import threading shared_res

        python的內置數據結構比如列表和字典等是線程安全的,但是簡單數據類型比如整數和浮點數則不是線程安全的,要這些簡單數據類型的通過操作,就需要使用鎖。

        #!/usr/bin/env python3
        # coding=utf-8
        
        import threading
        
        shared_resource_with_lock = 0
        shared_resource_with_no_lock = 0
        COUNT = 100000
        shared_resource_lock = threading.Lock()
        
        ####LOCK MANAGEMENT##
        def increment_with_lock():
         global shared_resource_with_lock
         for i in range(COUNT):
         shared_resource_lock.acquire()
         shared_resource_with_lock += 1
         shared_resource_lock.release()
         
        def decrement_with_lock():
         global shared_resource_with_lock
         for i in range(COUNT):
         shared_resource_lock.acquire()
         shared_resource_with_lock -= 1
         shared_resource_lock.release()
         ####NO LOCK MANAGEMENT ##
         
        def increment_without_lock():
         global shared_resource_with_no_lock
         for i in range(COUNT):
         shared_resource_with_no_lock += 1
         
        def decrement_without_lock():
         global shared_resource_with_no_lock
         for i in range(COUNT):
         shared_resource_with_no_lock -= 1
         
        ####the Main program
        if __name__ == "__main__":
         t1 = threading.Thread(target = increment_with_lock)
         t2 = threading.Thread(target = decrement_with_lock)
         t3 = threading.Thread(target = increment_without_lock)
         t4 = threading.Thread(target = decrement_without_lock)
         t1.start()
         t2.start()
         t3.start()
         t4.start()
         t1.join()
         t2.join()
         t3.join()
         t4.join()
         print ("the value of shared variable with lock management is %s"
         %shared_resource_with_lock)
         print ("the value of shared variable with race condition is %s"
         %shared_resource_with_no_lock)
        
        

        執行結果:

        $ ./threading_lock.py 
        
        
        the value of shared variable with lock management is 0
        the value of shared variable with race condition is 0
        
        

        又如:

        import random
        import threading
        import time
        logging.basicConfig(level=logging.DEBUG,
         format='(%(threadName)-10s) %(message)s',
         )
         
        class Counter(object):
         def __init__(self, start=0):
         self.lock = threading.Lock()
         self.value = start
         def increment(self):
         logging.debug(time.ctime(time.time()))
         logging.debug('Waiting for lock')
         self.lock.acquire()
         try:
         pause = random.randint(1,3)
         logging.debug(time.ctime(time.time()))
         logging.debug('Acquired lock') 
         self.value = self.value + 1
         logging.debug('lock {0} seconds'.format(pause))
         time.sleep(pause)
         finally:
         self.lock.release()
        def worker(c):
         for i in range(2):
         pause = random.randint(1,3)
         logging.debug(time.ctime(time.time()))
         logging.debug('Sleeping %0.02f', pause)
         time.sleep(pause)
         c.increment()
         logging.debug('Done')
        counter = Counter()
        for i in range(2):
         t = threading.Thread(target=worker, args=(counter,))
         t.start()
        logging.debug('Waiting for worker threads')
        main_thread = threading.currentThread()
        for t in threading.enumerate():
         if t is not main_thread:
         t.join()
        logging.debug('Counter: %d', counter.value)
        

        執行結果:

        $ python threading_lock.py 
        

        (Thread-1 ) Tue Sep 15 15:49:18 2015
        (Thread-1 ) Sleeping 3.00
        (Thread-2 ) Tue Sep 15 15:49:18 2015
        (MainThread) Waiting for worker threads
        (Thread-2 ) Sleeping 2.00
        (Thread-2 ) Tue Sep 15 15:49:20 2015
        (Thread-2 ) Waiting for lock
        (Thread-2 ) Tue Sep 15 15:49:20 2015
        (Thread-2 ) Acquired lock
        (Thread-2 ) lock 2 seconds
        (Thread-1 ) Tue Sep 15 15:49:21 2015
        (Thread-1 ) Waiting for lock
        (Thread-2 ) Tue Sep 15 15:49:22 2015
        (Thread-1 ) Tue Sep 15 15:49:22 2015
        (Thread-2 ) Sleeping 2.00
        (Thread-1 ) Acquired lock
        (Thread-1 ) lock 1 seconds
        (Thread-1 ) Tue Sep 15 15:49:23 2015
        (Thread-1 ) Sleeping 2.00
        (Thread-2 ) Tue Sep 15 15:49:24 2015
        (Thread-2 ) Waiting for lock
        (Thread-2 ) Tue Sep 15 15:49:24 2015
        (Thread-2 ) Acquired lock
        (Thread-2 ) lock 1 seconds
        (Thread-1 ) Tue Sep 15 15:49:25 2015
        (Thread-1 ) Waiting for lock
        (Thread-1 ) Tue Sep 15 15:49:25 2015
        (Thread-1 ) Acquired lock
        (Thread-1 ) lock 2 seconds
        (Thread-2 ) Done
        (Thread-1 ) Done
        (MainThread) Counter: 4
        

        acquire()中傳入False值,可以檢查是否獲得了鎖。比如:

        import logging
        import threading
        import time
        logging.basicConfig(level=logging.DEBUG,
         format='(%(threadName)-10s) %(message)s',
         )
         
        def lock_holder(lock):
         logging.debug('Starting')
         while True:
         lock.acquire()
         try:
         logging.debug('Holding')
         time.sleep(0.5)
         finally:
         logging.debug('Not holding')
         lock.release()
         time.sleep(0.5)
         return
         
        def worker(lock):
         logging.debug('Starting')
         num_tries = 0
         num_acquires = 0
         while num_acquires < 3:
         time.sleep(0.5)
         logging.debug('Trying to acquire')
         have_it = lock.acquire(0)
         try:
         num_tries += 1
         if have_it:
         logging.debug('Iteration %d: Acquired',
         num_tries)
         num_acquires += 1
         else:
         logging.debug('Iteration %d: Not acquired',
         num_tries)
         finally:
         if have_it:
         lock.release()
         logging.debug('Done after %d iterations', num_tries)
        lock = threading.Lock()
        holder = threading.Thread(target=lock_holder,
         args=(lock,),
         name='LockHolder')
        holder.setDaemon(True)
        holder.start()
        worker = threading.Thread(target=worker,
         args=(lock,),
         name='Worker')
        worker.start()
        

        執行結果:

        $ python threading_lock_noblock.py 
        

        (LockHolder) Starting
        (LockHolder) Holding
        (Worker ) Starting
        (LockHolder) Not holding
        (Worker ) Trying to acquire
        (Worker ) Iteration 1: Acquired
        (LockHolder) Holding
        (Worker ) Trying to acquire
        (Worker ) Iteration 2: Not acquired
        (LockHolder) Not holding
        (Worker ) Trying to acquire
        (Worker ) Iteration 3: Acquired
        (LockHolder) Holding
        (Worker ) Trying to acquire
        (Worker ) Iteration 4: Not acquired
        (LockHolder) Not holding
        (Worker ) Trying to acquire
        (Worker ) Iteration 5: Acquired
        (Worker ) Done after 5 iterations
        
        

        線程安全鎖

        threading.RLock()
        

        返回可重入鎖對象。重入鎖必須由獲得它的線程釋放。一旦線程獲得了重入鎖,同一線程可不阻塞地再次獲得,獲取之后必須釋放。

        通常一個線程只能獲取一次鎖:

        import threading
        
        lock = threading.Lock()
        
        print 'First try :', lock.acquire()
        print 'Second try:', lock.acquire(0)
        
        

        執行結果:

        $ python threading_lock_reacquire.py
        

        First try : True
        Second try: False
        

        使用RLock可以獲取多次鎖:

        import threading
        lock = threading.RLock()
        print 'First try :', lock.acquire()
        print 'Second try:', lock.acquire(0)
        

        執行結果:

        python threading_rlock.py 
        

        First try : True
        Second try: 1
        

        再來看一個例子:

        #!/usr/bin/env python3
        # coding=utf-8
        import threading
        import time
        class Box(object):
         lock = threading.RLock()
         def __init__(self):
         self.total_items = 0
         def execute(self,n):
         Box.lock.acquire()
         self.total_items += n
         Box.lock.release()
         def add(self):
         Box.lock.acquire()
         self.execute(1)
         Box.lock.release()
         def remove(self):
         Box.lock.acquire()
         self.execute(-1)
         Box.lock.release()
         
        ## These two functions run n in separate
        ## threads and call the Box's methods 
        def adder(box,items):
         while items > 0:
         print ("adding 1 item in the box
        ")
         box.add()
         time.sleep(5)
         items -= 1
         
        def remover(box,items):
         while items > 0:
         print ("removing 1 item in the box")
         box.remove()
         time.sleep(5)
         items -= 1
         
        ## the main program build some
        ## threads and make sure it works
        if __name__ == "__main__":
         items = 5
         print ("putting %s items in the box " % items)
         box = Box()
         t1 = threading.Thread(target=adder,args=(box,items))
         t2 = threading.Thread(target=remover,args=(box,items))
         t1.start()
         t2.start()
         t1.join()
         t2.join()
         print ("%s items still remain in the box " % box.total_items)
        

        執行結果:

        $ python3 threading_rlock2.py 
        

        putting 5 items in the box 
        adding 1 item in the box
        removing 1 item in the box
        adding 1 item in the box
        removing 1 item in the box
        adding 1 item in the box
        removing 1 item in the box
        removing 1 item in the box
        adding 1 item in the box
        removing 1 item in the box
        adding 1 item in the box
        0 items still remain in the box
        

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        舉例講解Python編程中對線程鎖的使用

        舉例講解Python編程中對線程鎖的使用:鎖 python的內置數據結構比如列表和字典等是線程安全的,但是簡單數據類型比如整數和浮點數則不是線程安全的,要這些簡單數據類型的通過操作,就需要使用鎖。 #!/usr/bin/env python3 # coding=utf-8 import threading shared_res
        推薦度:
        標簽: python python的
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲精品亚洲人成在线观看| 又大又黄又粗又爽的免费视频| 国产精品亚洲片在线| 美女露100%胸无遮挡免费观看 | 无码少妇一区二区浪潮免费 | 亚洲欧洲精品成人久久曰| 免费看黄视频网站| 亚洲影视自拍揄拍愉拍| 亚洲愉拍一区二区三区| 成在人线av无码免费高潮水| 中文字幕不卡亚洲| 国产激情免费视频在线观看| 亚洲国产老鸭窝一区二区三区| 日韩av无码久久精品免费| 亚洲欧洲日产v特级毛片| 四虎永久在线精品免费网址| 亚洲成在人线在线播放无码| 亚洲第一黄色网址| 中国一级特黄高清免费的大片中国一级黄色片 | 亚洲国产精品成人精品无码区在线| 最近国语视频在线观看免费播放| 日本亚洲成高清一区二区三区| 无码少妇精品一区二区免费动态 | 国产午夜亚洲精品不卡| 亚洲精品成a人在线观看| 99久久免费国产特黄| 亚洲色成人网一二三区| 成年人免费网站在线观看| 亚洲影院在线观看| 四虎永久在线观看免费网站网址| 亚洲男人的天堂网站| 国产综合亚洲专区在线| 2015日韩永久免费视频播放| 在线观看亚洲天天一三视| 三年片在线观看免费大全电影 | 久久99热精品免费观看动漫| 亚洲日本va一区二区三区| a级亚洲片精品久久久久久久| 免费观看激色视频网站(性色)| 亚洲精品色播一区二区| 亚洲av无码片在线播放|