python (高级消息队列)普通、进程、进程池的消息队列
一、普通消息隊列
from queue import Queue?
這個是普通的隊列模式,類似于普通列表,先進先出模式,get方法會阻塞請求,直到有數據get出來為止。
二、多進程消息隊列
from multiprocessing.Queue import Queue(各子進程共有)
這個是多進程并發的Queue隊列,用于解決多進程間的通信問題。普通Queue實現不了。例如來跑多進程對一批IP列表進行運算,運算后的結果都存到Queue隊列里面,這個就必須使用multiprocessing提供的Queue來實現。
創建
import multiprocessing queue = multiprocessing.Queue(隊列長度)?
因為進程間不共享全局變量,所以使用Queue進行數據通信,可以在父進程中創建兩個字進程,一個往Queue里寫數據,一個從Queue里取出數據。?
import multiprocessing import timedef write_queue(queue):# 循環寫入數據for i in range(10):if queue.full():print("隊列已滿!")break# 向隊列中放入消息queue.put(i)print(i)time.sleep(0.5)def read_queue(queue):# 循環讀取隊列消息while True:# 隊列為空,停止讀取if queue.empty():print("---隊列已空---")break# 讀取消息并輸出result = queue.get()print(result)if __name__ == '__main__':# 創建消息隊列queue = multiprocessing.Queue(3)# 創建子進程p1 = multiprocessing.Process(target=write_queue, args=(queue,))p1.start()# 等待p1寫數據進程執行結束后,再往下執行p1.join()p1 = multiprocessing.Process(target=read_queue, args=(queue,))p1.start()三、進程池消息隊列
? ? ? ? 初始化Pool時,可以指定一個最大進程數,當有新的請求提交到Pool中時,如果池還沒有滿,那么就會創建一個新的進程用來執行該請求;但如果池中的進程數已經達到指定的最大值,那么該請求就會等待,直到池中有進程結束,才會用之前的進程來執行新的任務。?
創建
import multiprocessing pool = multiprocessing.Pool(最大進程數)?
進程池內通信?
創建進程池內Queue消息隊列通信?
import multiprocessing?
Queue:queue = multiprocessing.Manager().Queue()?
例:?
import multiprocessing?
import time
事例:
def write_data(queue):?# for循環 向消息隊列中寫入值?for i in range(5):?# 添加消息?queue.put(i)?print(i)?time.sleep(0.2)?print(“隊列已滿~”)def read_data(queue):# 循環讀取數據while True:# 判斷隊列是否為空if queue.qsize() == 0:print("隊列為空~")break# 從隊列中讀取數據result = queue.get()print(result)if __name__ == '__main__':# 創建進程池pool = multiprocessing.Pool(2)# 創建進程池隊列queue = multiprocessing.Manager().Queue()# 在進程池中的進程間進行通信# 使用線程池同步的方式,先寫后讀# pool.apply(write_data, (queue, ))# pool.apply(read_data, (queue, ))# apply_async() 返回ApplyResult 對象result = pool.apply_async(write_data, (queue, ))# ApplyResult對象的wait() 方法,表示后續進程必須等待當前進程執行完再繼續result.wait()pool.apply_async(read_data, (queue, ))pool.close()# 異步后,主線程不再等待子進程執行結束,再結束# join() 后,表示主線程會等待子進程執行結束后,再結束pool.join()?
?
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的python (高级消息队列)普通、进程、进程池的消息队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++:uint64_t 转为cha
- 下一篇: websocket python爬虫_p