結論:python多程序間用queue通訊時,如果子程序操作queue滿了或者內容比較大的情況下,該子程序會阻塞等待取走queue內容(如果queue資料量比較少,不會等待),如果呼叫join,主程序將處於等待,等待子程序結束,造成死鎖
解決方式:在呼叫join前,及時把queue的資料取出,而且queue.get需要在join前
原理分析
模擬子程序阻塞:
from multiprocessing import process, queue
def fun(q):
num = 1000000000
q.put('=' * num)
print("done put")
if __name__ == '__main__':
queue = queue()
p = process(target=fun, args=(queue,))
p.start()
p.join()
print("done")
原因分析:
# queue type using a pipe, buffer and thread
class queue(object):
multiprocessing.queue底層是基於pipe構建,作業系統管道不是無限長,因此子程序在執行put()期間,處於阻塞,直到某些其他程序使用get()從佇列中取走資料。上例中,主程序等待子程序,列印不了done
而當佇列put資料比較少時,是沒有問題的,先列印done put,再列印done,但這樣寫法是有隱患,當put資料比較多時,就會阻塞
from multiprocessing import process, queue
def fun(q):
num = 1
q.put('=' * num)
print("done put")
if __name__ == '__main__':
queue = queue()
p = process(target=fun, args=(queue,))
p.start()
p.join()
print("done")
正確的寫法
from multiprocessing import process, queue
def fun(q):
num = 1000000000
q.put('=' * num)
print("done put")
if __name__ == '__main__':
queue = queue()
p = process(target=fun, args=(queue,))
p.start()
queue.get()
p.join()
print("done")
在join前面呼叫queue.get
注意!!!以下這樣寫法也是不對的,join要在queue.get前面,不然主程序等待子程序結束,而子程序等待佇列資料取走,造成死鎖
p = process(target=fun, args=(queue,))
p.start()
p.join()
queue.get()
python多執行緒補充
python 是一門解釋型語言,它的執行是由直譯器來控制的。
gil,全稱是 global interpreter lock ,全域性解釋鎖 ,專門給直譯器用
一般情況下在使用者態下是無法做到執行緒級別的時間片輪轉
但是 python 能做到!python 裡,直譯器可以記錄每乙個執行緒執行了多長時間——時間一到,就能夠切換到另一條執行緒。
gil 就是拿來給執行緒加鎖的,當乙個執行緒將要執行時,直譯器會把 gil 鎖給這個執行緒,其他執行緒因為沒有鎖,是無法執行的。等到持有鎖線程阻塞或者執行 100 個位元組碼,直譯器就會把鎖交給其他執行緒。
但是這個 gil 鎖是全域性(global)的,也就導致即使是多核情況下,一次也只有乙個執行緒能執行,從整體上看,整個程式是序列的。
python多執行緒應用
也就是說 python 的多執行緒適合 i/o 密集型的程式,但是對計算密集型程式就不那麼友好了
對於計算密集型程式用多程序或者讓 python 呼叫 c 語言的**,在 c 語言裡實現多執行緒
python多程序爬蟲卡住 Python多程序爬蟲
匯入第3方庫 from bs4 import beautifulsoup from spider.extra import utils from multiprocessing import process,value,joinablequeue,manager,pool import thread...
python多程序 python多程序
當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...
python多程序 Python多程序實踐
建立程序方式如下 可以通過lock鎖機制實現共享鎖,但比較常用的方式還是以上這些方式,效率更高,更安全。使用方式 構造 類方法 使用方式 構造 更多型別支援一般使用manager,支援的型別包括list,dict,namespace,lock,rlock,semaphore,boundedsemap...