Python多執行緒中阻塞(join)與鎖(Lock)使用誤區解析
這篇文章主要為大家詳細 介紹了Python多執行緒中阻塞join與鎖Lock的使用誤區,具有一定的參考價值,有興趣的小夥伴們可以參考一下
關於阻塞主執行緒
##join的錯誤用法Thread.join() 作用為阻塞主執行緒,即在子執行緒未返回的時候,主執行緒等待其返回然後再繼續執行.
join不能與start在循環裡連用以下為錯誤代碼,代碼創建了5個線程,然後用一個循環激活線程,激活之後令其阻塞主線程.
threads = [Thread() for i in range(5)] for thread in threads: thread.start() thread.join()
2.由於start函數不會阻塞主執行緒,在執行緒1進行運算的同時,主執行緒向下執行join函數.
3. 執行join之後,主執行緒被執行緒1阻塞,在執行緒1回傳結果之前,主執行緒無法執行下一輪循環.
4. 線程1計算完成之後,解除對主線程的阻塞.
5. 主線程進入下一輪循環,激活線程2並被其阻塞…
join的正確用法
使用兩個循環分別處理start和join函數.即可實現並發.
##threads = [Thread() for i in range(5)] for thread in threads: thread.start() for thread in threads: thread.join()
time.sleep代替join進行調試
之前在一些項目裡看到過這樣的代碼,使用time.sleep代替join手動阻塞主線程.
在所有子線程返回之前,主線程陷入無線循環而不能退出.for thread in threads: thread.start() while 1: if thread_num == 0: break time.sleep(0.01)
單核心CPU PIL是否還需要鎖定?
非原子操作
count = count 1理論上是線程不安全的. 使用3個線程同時執行上述操作改變全域變數count的值,並查看程式執行結果. 如果結果正確,則表示未出現執行緒衝突.
使用下列程式碼測試
# -*- coding: utf-8 -*- import threading import time count = 0 class Counter(threading.Thread): def __init__(self, name): self.thread_name = name super(Counter, self).__init__(name=name) def run(self): global count for i in xrange(100000): count = count + 1 counters = [Counter('thread:%s' % i) for i in range(5)] for counter in counters: counter.start() time.sleep(5) print 'count=%s' % count
執行結果:
count=275552事實上每次運行結果都不相同且不正確,這證明單核心CPU PIL仍無法保證執行緒安全,需要加鎖.
加上鎖定後的正確程式碼:
# -*- coding: utf-8 -*- import threading import time count = 0 lock = threading.Lock() class Counter(threading.Thread): def __init__(self, name): self.thread_name = name self.lock = threading.Lock() super(Counter, self).__init__(name=name) def run(self): global count global lock for i in xrange(100000): lock.acquire() count = count + 1 lock.release() counters = [Counter('thread:%s' % i) for i in range(5)] for counter in counters: counter.start() time.sleep(5) print 'count=%s' % count
#結果:
count=500000
##注意鎖的全局性
這是一個簡單的Python語法問題,但在邏輯複雜時有可能被忽略.要保證鎖對於多個子線程來說是共用的,即不要在Thread的子類內部創建鎖定.
# -*- coding: utf-8 -*- import threading import time count = 0 # lock = threading.Lock() # 正确的声明位置 class Counter(threading.Thread): def __init__(self, name): self.thread_name = name self.lock = threading.Lock() # 错误的声明位置 super(Counter, self).__init__(name=name) def run(self): global count for i in xrange(100000): self.lock.acquire() count = count + 1 self.lock.release() counters = [Counter('thread:%s' % i) for i in range(5)] for counter in counters: print counter.thread_name counter.start() time.sleep(5) print 'count=%s' % count
python多執行緒之事件Event的使用詳解############python執行緒池threadpool的實作########################
以上是Python多執行緒中阻塞(join)與鎖(Lock)使用誤區解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

VS Code可以在Windows 8上運行,但體驗可能不佳。首先確保系統已更新到最新補丁,然後下載與系統架構匹配的VS Code安裝包,按照提示安裝。安裝後,注意某些擴展程序可能與Windows 8不兼容,需要尋找替代擴展或在虛擬機中使用更新的Windows系統。安裝必要的擴展,檢查是否正常工作。儘管VS Code在Windows 8上可行,但建議升級到更新的Windows系統以獲得更好的開發體驗和安全保障。

VS Code 可用於編寫 Python,並提供許多功能,使其成為開發 Python 應用程序的理想工具。它允許用戶:安裝 Python 擴展,以獲得代碼補全、語法高亮和調試等功能。使用調試器逐步跟踪代碼,查找和修復錯誤。集成 Git,進行版本控制。使用代碼格式化工具,保持代碼一致性。使用 Linting 工具,提前發現潛在問題。

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

VS Code 擴展存在惡意風險,例如隱藏惡意代碼、利用漏洞、偽裝成合法擴展。識別惡意擴展的方法包括:檢查發布者、閱讀評論、檢查代碼、謹慎安裝。安全措施還包括:安全意識、良好習慣、定期更新和殺毒軟件。
