進(jìn)程線程協(xié)程通俗理解 簡述python進(jìn)程,線程和協(xié)程的區(qū)別及應(yīng)用場景?
簡述python進(jìn)程,線程和協(xié)程的區(qū)別及應(yīng)用場景?1. 線程和進(jìn)程:線程屬于進(jìn)程。線程在進(jìn)程空間中運(yùn)行。同一進(jìn)程生成的線程共享相同的內(nèi)存空間。當(dāng)一個(gè)進(jìn)程退出時(shí),該進(jìn)程生成的所有線程都將被強(qiáng)制退出并清除
簡述python進(jìn)程,線程和協(xié)程的區(qū)別及應(yīng)用場景?
1. 線程和進(jìn)程:線程屬于進(jìn)程。線程在進(jìn)程空間中運(yùn)行。同一進(jìn)程生成的線程共享相同的內(nèi)存空間。當(dāng)一個(gè)進(jìn)程退出時(shí),該進(jìn)程生成的所有線程都將被強(qiáng)制退出并清除。一個(gè)線程可以與屬于同一進(jìn)程的其他線程共享該進(jìn)程所擁有的所有資源,但它基本上不擁有系統(tǒng)資源,在操作中只有很少的基本信息(如程序計(jì)數(shù)器、一組寄存器和堆棧)。
2. 線程、進(jìn)程和協(xié)程:線程和進(jìn)程的操作是由程序觸發(fā)的,最后一個(gè)執(zhí)行者是系統(tǒng);協(xié)程的操作是程序員
協(xié)程存在的意義:對于多線程應(yīng)用,CPU通過切片在線程之間切換執(zhí)行,切換線程需要時(shí)間(保持狀態(tài),下次繼續(xù))。對于協(xié)同程序,只有一個(gè)線程用于指定一個(gè)線程中代碼塊的執(zhí)行順序。
協(xié)同程序的應(yīng)用場景:當(dāng)程序中存在大量不需要CPU的操作(IO)時(shí),適合協(xié)同程序;
python異步協(xié)程跟多進(jìn)程、多線程哪個(gè)效率高?
Python多線程不能有效,因?yàn)榇嬖贕il鎖,執(zhí)行不能并發(fā)。
排除一個(gè),留下異步進(jìn)程。效率的高低取決于計(jì)算密集型任務(wù)和進(jìn)程間通信的頻率。
還要記住,單個(gè)進(jìn)程是異步的,只有一個(gè)核心在滿負(fù)荷工作,而多進(jìn)程可以利用多核功能。
最后,可以混合使用多處理和異步。這種結(jié)構(gòu)與go有點(diǎn)類似,可能是最有效的組合。
感覺C 很簡單,但為何這么多勸退的?
寫CPP,語法痛點(diǎn)模板,當(dāng)你的模板錯(cuò)誤達(dá)到數(shù)百行,你就會明白說服1。第二個(gè)痛點(diǎn)是內(nèi)存操作,包括內(nèi)存溢出、內(nèi)存泄漏、臟內(nèi)存數(shù)據(jù)、共享內(nèi)存、內(nèi)存池等相關(guān)問題。遲早,程序會崩潰,1會被阻止。第三個(gè)難點(diǎn)是鎖定、多處理、多線程、協(xié)同編程、流水線通信和消息機(jī)制。這些都是操作系統(tǒng)的相關(guān)知識,要理解并不比學(xué)習(xí)CPP容易。1第四,由于使用了CPP,所以遲早會使用so和DLL。相應(yīng)的調(diào)試噩夢即將來臨。用GDB在服務(wù)器上調(diào)試多進(jìn)程、多線程程序的難度和復(fù)雜性會使人迷路。1第五,不同的平臺和編譯器,優(yōu)化和非優(yōu)化導(dǎo)致不同的程序運(yùn)行結(jié)果。此時(shí),我無言以對。第六個(gè)是宏噩夢、DLL依賴噩夢、CPP編譯時(shí)間噩夢,以及突然系統(tǒng)升級(安全漏洞修復(fù))導(dǎo)致的庫不兼容噩夢。沒有經(jīng)歷過的人是感覺不到的。
多線程編程的時(shí)候,使用無鎖結(jié)構(gòu)會不會比有鎖結(jié)構(gòu)更加快?
這是毫無疑問的,因?yàn)榫€程鎖定是資源密集型的
!那么,如何避免鎖的性能下降呢?
1、從業(yè)務(wù)上避免大量鎖結(jié)構(gòu)
!2. 使用ThreadLocal,可以保證每個(gè)線程中的數(shù)據(jù)不會互相污染
!3. 如果讀多寫少,請使用讀寫鎖
!4. 自旋鎖將挑戰(zhàn)CPU,盡管它是一個(gè)線程時(shí)間很少的鎖
!5. 鎖的粒度應(yīng)該盡可能小:可以在方法中的鎖不應(yīng)該占用整個(gè)方法