python多程序卡住 python多程序假死

2021-10-11 12:53:38 字數 2131 閱讀 2542

結論: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...