創(chuàng)建一個隊列:queue_obj = queue.Queue(maxsize=30)
maxsize :表示允許存儲的最
(FIFO) : 對列--先進(jìn)先出
存值 : queue_obj.put( )
取值 : queue_obj.get( )
獲取隊列的大小 : queue_obj.qsize( )
判斷隊列是否滿 : queue_obj.full( )
判斷隊列是否為空 : queue_obj.empty()
# 注意 : 隊列是線程安全的,list,dict 是非線程安全的,使用的時候最好使用線程鎖
多線程
什么是多任務(wù):同時執(zhí)行多個任務(wù) 例如:同時打開微信,QQ,word,優(yōu)酷分井,瀏覽器
同時執(zhí)行--并行
單核同時執(zhí)行的任務(wù)數(shù)量只有一個,但是看上去像是在執(zhí)行多個任務(wù)徙硅,是? ? ? ? ? 因為切換的間隔時間級短
多核cpu:同時可以執(zhí)行多個任務(wù)印蔗,假如任務(wù)量超過核心數(shù),在某個核心下? 任務(wù)會交替執(zhí)行
并發(fā)和并行的概念:
并發(fā):單核cpu同時執(zhí)行多個任務(wù)乾蓬,任務(wù)是同時發(fā)起的河劝,但是并不是同時執(zhí)行壁榕,而是交替執(zhí)行
并行:任務(wù)數(shù)量小于或等于核心數(shù),這個時候每一個核心都在執(zhí)行任務(wù)赎瞎,任務(wù)是同時執(zhí)行的护桦,
實(shí)現(xiàn)多任務(wù)的手段(方式):
1.多線程
2.多進(jìn)程
3.協(xié)程
線程之間的操作是無序的
一個線程下面有一個主線程
線程:相當(dāng)于打開一個瀏覽器
進(jìn)程:相當(dāng)于在瀏覽器里面打開多個窗口
? 啟動線程: thread.start()
? 添加join的目的:為了讓任務(wù)隊里中的所有請求都執(zhí)行完畢
? 線程鎖:threadlock = threading.Lock()
進(jìn)程池
導(dǎo)入? ? from multiprocessing import Pool
創(chuàng)建一個進(jìn)程池:pool = Pool()
pool.apply()? 同步的方法,執(zhí)行效率比較低
apply_async? 是一個異步方法,可以提高任務(wù)執(zhí)行的效率
func,對應(yīng)的任務(wù)的函數(shù)名稱
args=(),傳遞參數(shù)(元組)
kwds={}, 傳遞參數(shù)(字典)
callback=None,(執(zhí)行成功后的回調(diào))
error_callback=None,(執(zhí)行錯誤之后的回調(diào))
關(guān)閉進(jìn)程池:pool.close? pool.join():join方法 讓進(jìn)程池中的任務(wù)執(zhí)行完畢后煎娇,回到主線程繼續(xù)執(zhí)行? pool.submit(): 向進(jìn)程池中添加任務(wù)? .add_done_callback():添加回調(diào)方法? pool.shutdown():執(zhí)行了join 方法? ? 使用manage().Queue() 創(chuàng)建一個隊列二庵,可以實(shí)現(xiàn)在進(jìn)程池的進(jìn)程中實(shí)現(xiàn)數(shù)據(jù)的共享(通訊)? q = Manger().Queue()