mywang88
2019-04-10
簡介
Python 通過 threading 庫來處理多線程問題,通過 multiprocessing 庫來處理多進程問題。
多線程和多進程問題中,都有隊列 Queue 這一工具,可用來實現線程或進程間的通信。
開發中遇到了這樣一個問題:主程序是一個多線程的進程,同時爲了滿足業務需求創建了若干個子進程,要求主程序的每一個線程都能與一個配套的子進程之間進行響應式的通信。
這裏用到了 multiprocessing 庫的 Queue 類,即多進程阻塞隊列。
Python 版本是 3.7。
示例
儘量簡化的示例代碼:
from threading import Thread
import multiprocessing
from time import sleep
# 定義一個每兩秒數一個數的函數
def count(name: str, q: multiprocessing.Queue):
for n in range(120):
print(name, n)
sleep(2)
if name == 't1' and n == 10:
# 線程 t1 將從阻塞隊列處獲取數據,如果沒有數據,將一直等待
q.get()
# 定義一個多進程的阻塞隊列
q1 = multiprocessing.Queue()
# 定義兩個線程
t1 = Thread(target=count, args=('t1', q1))
t2 = Thread(target=count, args=('t2', q1))
# 啓動兩個線程
t1.start()
sleep(1)
t2.start()
這個示例中沒有創建一個子進程,只演示了通過阻塞隊列達到預期目標。
值得補充的是,在主程序的一個子線程中調用 q.get()
方法並不會使整個主程序暫停等待,暫停等待的僅僅是這個子線程而已,主程序的運行不受影響。