第一次寫,剛學,折磨了我一下午。
import time
from multiprocessing import Pool, Manager, Queue
# 擷取資料
def reader(queueRead, char, lock):
# 加鎖
lock.acquire()
if not queueRead.full():
print("--Reader--" + char)
queueRead.put(char)
time.sleep(1)
# 釋放
lock.release()
# 整理資料
def changer(queueRead, queueChange, lock):
lock.acquire()
if not queueRead.empty():
tempChar = queueRead.get()
tempChar = tempChar.lower()
print("--Changer--" + tempChar)
if not queueChange.full():
queueChange.put(tempChar)
time.sleep(1)
lock.release()
# 展示資料
def shower(queueChange):
if not queueChange.empty():
tempChar = queueChange.get()
print("--Shower--" + tempChar)
time.sleep(1)
def main():
charArray = "ABCDEFG"
manager = Manager()
# 讀取資料隊列
queueRead = manager.Queue(3)
# 整理資料隊列
queueChange = manager.Queue(4)
# 多個程序控制一個隊列,需要加鎖,防堵塞
lock = manager.Lock()
# 建立 3 個子程序
processPool = Pool(3)
for char in charArray:
# 給各子程序指派任務
processPool.apply_async(reader, args=(queueRead, char, lock, ))
processPool.apply_async(changer, args=(queueRead, queueChange, lock, ))
processPool.apply_async(shower, args=(queueChange, ))
processPool.close() # 程序池不再接受任務
processPool.join() # 等待所有子程序結束
if __name__ == '__main__':
print("=== Start ===")
main()
print("=== End ===")
效果: