Python3 threading的多線程管理中的線程管理與鎖


  提到Python的多線程,大家都說雞肋。至於為什么,一定又要說什么“GIL的全稱是Global Interpreter Lock(全局解釋器鎖)”之類的解釋了,哥書讀的少,聽不太懂,反正能讓我們這種村里人看到同時跑了幾個就行,至於什么多線程多進程,CPU是並行還是並發的,都隨他去吧。

  今天主要說一下threading模塊的進程鎖與進程管理內容。

  用threading有幾次,都是簡單的有兩個或者三個任務需要並發執行,比如服務器的主備等等,不用管它鎖不鎖的。但這次想用於管理幾百個任務的依次並發,不得不看看了。

先說下threading.lock()

  由於存在多個進程共同去修改某個數據的問題,所以必須要用到lock()

  這東西比較簡單,lock.acquire()用於添加鎖,lock.release() 用於釋放鎖。太簡單就不舉例子了。

重點說下threading.Semaphore

  Semaphore 在內部存在一個計數器,在用戶調用 acquire() 時,計數器 -1,release() 則+1

舉個例子說明下吧,剛好用下下午的簡單測試代碼:

 1 from selenium import webdriver
 2 import threading
 3 import time
 4 import random
 5 
 6 
 7 def first_test(url):
 8     sem.acquire()  # 注意要第一時間去修改計數器 這點很重要
 9     firsttest = webdriver.Chrome()
10     try:
11         firsttest.get(url)  # 發送get請求
12         time.sleep(random.randint(0, 50))  # 為了看清變化 random設置的比較大
13     except Exception as ErrorInfo:
14         print(ErrorInfo)
15     finally:
16         sem.release()
17         firsttest.close()  # 關閉谷歌瀏覽器
18 
19 
20 if __name__ == '__main__':
21     url = 'http://www.cnblogs.com/Dracular/p/8365989.html'
22     sem = threading.Semaphore(3) # 設置線程閥值
23     for i in range(10):
24         t = threading.Thread(target=first_test, args=(url,))
25         t.start()
26         time.sleep(0.1)
27 
28     while threading.active_count() != 1:
29         pass  # print threading.active_count()
30     else:
31         print('### Selenium Jobs is over!!!###')

由於為了保證計數器的不為負(因為變成負數,就相當於阻塞了哦....),最好使用finally,來進行release()的修改....

好了,點滴積累......

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM