線程识埋、進(jìn)程凡伊、協(xié)程三者的關(guān)系
進(jìn)程是什么呢?
直白地講窒舟,進(jìn)程就是應(yīng)用程序的啟動(dòng)實(shí)例系忙。比如我們運(yùn)行一個(gè)游戲,打開一個(gè)軟件惠豺,就是開啟了一個(gè)進(jìn)程银还。
進(jìn)程擁有代碼和打開的文件資源、數(shù)據(jù)資源洁墙、獨(dú)立的內(nèi)存空間蛹疯。
線程又是什么呢?
線程從屬于進(jìn)程热监,是程序的實(shí)際執(zhí)行者捺弦。一個(gè)進(jìn)程至少包含一個(gè)主線程,也可以有更多的子線程。
什么是協(xié)程
協(xié)程列吼,英文Coroutines幽崩,是一種比線程更加輕量級(jí)的存在。正如一個(gè)進(jìn)程可以擁有多個(gè)線程一樣寞钥,一個(gè)線程也可以擁有多個(gè)協(xié)程慌申。
進(jìn)程
是一個(gè)執(zhí)行中的程序
每個(gè)進(jìn)程都擁有自己的地址空間、內(nèi)存理郑、數(shù)據(jù)棧以及其他用于跟蹤執(zhí)行的輔助數(shù)據(jù)
操作系統(tǒng)管理其上所有進(jìn)程的執(zhí)行蹄溉,并未這些進(jìn)程合理的分配時(shí)間
進(jìn)程也可以通過派生新的進(jìn)程來執(zhí)行其他任務(wù)
進(jìn)程模塊介紹
使用multiprocessing實(shí)現(xiàn)多進(jìn)程代碼
用multiprocessing.Process創(chuàng)建進(jìn)程
start()啟動(dòng)進(jìn)程? ? ? ? ? join()掛起進(jìn)程
os.getpid()獲得進(jìn)程得ID
進(jìn)程得實(shí)現(xiàn)
第一種實(shí)現(xiàn)(直接實(shí)例化Process對(duì)象)
第二種實(shí)現(xiàn)(通過繼承,重寫run方法)
進(jìn)程之間的通信
通過Queue您炉、Pipes等實(shí)現(xiàn)進(jìn)程之間的通信
多進(jìn)程中的鎖
Lock() 在單線程中类缤,只能鎖一次
RLock()?在單線程中,可以所多次邻吭,但是最后也需要釋放多次
Condition()
添加鎖的兩種方式:
with lock:
? ? pass
try:
? ? lock.acquire()
finally:
? ? lock.release()
使用進(jìn)程池
程序邏輯:
1餐弱、向文件中寫入內(nèi)容,并使用線程池
2囱晴、定義函數(shù)實(shí)現(xiàn)向文件中寫入數(shù)據(jù)的功能
3膏蚓、寫入的內(nèi)容:線程名、pid畸写、線程序號(hào)驮瞧,最后打印寫入內(nèi)容
4、寫入后隨機(jī)休息1-3s
5枯芬、pool.apply同步添加任務(wù)
線程
在同一進(jìn)程下執(zhí)行论笔,并共享相同的上下文
一個(gè)進(jìn)程中的各個(gè)線程與主線程共享同一片數(shù)據(jù)空間
線程包括開始、執(zhí)行順序和結(jié)束三部分
它可以被搶占(中斷)和臨時(shí)掛起(也稱為睡眠)
一般是以并發(fā)方式執(zhí)行
并發(fā)
是一種屬性——程序千所、算法或問題的屬性
并行只是并發(fā)問題的可能方法之一
如果兩個(gè)事件互不影響狂魔,則兩個(gè)事件是并發(fā)的
實(shí)現(xiàn)一個(gè)線程
使用threading模塊
用threading.Tread創(chuàng)建線程
start()啟動(dòng)線程
join()掛起線程
第一種實(shí)現(xiàn)方式
ps:join()函數(shù)的作用:如果thread是某個(gè)子線程,則調(diào)用thread.join()的作用是確保thread子線程執(zhí)行完畢后才能執(zhí)行下一個(gè)線程淫痰。
詳細(xì)解釋見:https://blog.csdn.net/xinghen1993/article/details/100691562
第二種實(shí)現(xiàn)方式(繼承)
實(shí)現(xiàn)多個(gè)線程
多線程中的鎖的實(shí)現(xiàn)
Lock() 在單線程中最楷,只能鎖一次
RLock()?在單線程中,可以所多次待错,但是最后也需要釋放多次
Condition()
結(jié)合with語句使用鎖
這樣可以省略手動(dòng)添加和釋放鎖的步驟
線程的調(diào)度和優(yōu)化
傳統(tǒng)方法
用時(shí)(30.021271228790283s)
使用線程優(yōu)化
用時(shí)(3.077522039413452s)
使用線程池來優(yōu)化
用時(shí)(3.030210256576538s)
使用 ThreadPoolExecutor來優(yōu)化
用時(shí)(3.033679246902466s)
使用傳統(tǒng)方法和使用線程相比籽孙,使用線程可以大大縮短完成任務(wù)的時(shí)間(這個(gè)速度與同時(shí)執(zhí)行的線程數(shù)有關(guān)),這里也列舉的線程池的使用情況火俄,可以發(fā)現(xiàn)使用線程池之后代碼會(huì)更加的簡(jiǎn)單犯建,不用重復(fù)的新建和關(guān)閉線程,提高效率瓜客,對(duì)于Pool與ThreadPoolExecutor這兩種線程池的實(shí)現(xiàn)适瓦,后者效率會(huì)更高一點(diǎn)沟启,都有人使用。