- N +

異步和多線程的區別,python異步和多線程區別

大家好,如果您還對異步和多線程的區別不太了解,沒有關系,今天就由本站為大家分享異步和多線程的區別的知識,包括python異步和多線程區別的問題都會給大家分析到,還望可以解決大家的問題,下面我們就開始吧!

異步編程與多線程編程的聯系和區別

網絡編程中,同步的意思是說,進行收發數據,等到數據真正發送出去或者接受到,才返回;而異步的意思是,可以把數據發送到緩沖區立即返回,而發送成功的消息是通過事件通知的。

異步可以騰出更多的CPU來處理其他事情,所以異步的方式比較靈活。

線程同步是指,多個線程協同完成一件工作,一個線程需要等待其他線程完成相關的工作,才能接著往下運行。

線程同步一般采用互斥體,信號量,消息等方式。

在多線程中使用同步Socket和異步Socket的區別

質都是一樣的

SocketChannel屬于nio,支持異步非阻塞連接.當然Socket也可以自己來實現非阻塞連接.

一般來說使用SocketChannel會有更好的性能(Socket實際應該比SocketChannel更高效,不過一般使用到最后,由于使用者設計等原因,效率反而比直接使用SocketChannel低)

什么是異步處理

異步處理就是按照不同步的程序處理問題。

異步處理與同步處理是對立的,而產生他們的是多線程或者多進程。異步處理的好處就是提高設備使用率,從而在宏觀上提升程序運行效率,但是弊端就是容易出現沖突操作和數據臟讀。同步則剛好相反,同步是一種降低設備使用率,在宏觀上降低了程序的運行效率,而且很多系統或者是運行環境在處理同步的時候為了維持同步的有效性也會付出許多格外的系統資源開支,對性能影響相當大。但是同步保證了程序運行的正確性與數據的完整性。

異步和同步區別

同步和異步的區別有:

1、概念不一樣:這是兩個相對的概念,同步是讓兩個或多個數據庫內容保持一致,或者按需要部分保持一致。異步則是計算機多線程的異步處理。異步的概念和同步相對。

2、要求不一樣:“同步通信”的通信雙方必須先建立同步,即雙方的時鐘要調整到同一個頻率。異步通信發送端不需要在發送一幀之前和接收端進行協調(不需要先進行比特同步)。

3、特點不一樣:異步通信的好處是通信設備簡單、便宜,但傳輸效率較低

Python多進程和多線程是雞肋嘛

GIL的存在一直是富有爭議的,它導致Python程序無法真正利用現代操作系統的多進程特性。需要注意的是,對于I/O圖形處理、NumPy數學計算這樣的耗時操作都發生在GIL之外,實際上基本不受影響,真正受影響的都是Python字節碼的執行,GIL會導致性能瓶頸的出現。總之,只有在使用純Python做CPU密集的多線程運算時GIL會是問題。GIL是什么

Python的代碼執行由Python虛擬機(也叫解釋器主循環,CPython版本)來控制,Python在設計之初就考慮到在解釋器的主循環中,同時只有一個線程在運行。即每個CPU在任意時刻只有一個線程在解釋器中運行。對Python虛擬機訪問的控制由全局解釋鎖GIL控制,正是這個鎖來控制同一時刻只有一個線程能夠運行。——在單核CPU下的多線程其實都只是并發,不是并行。

并發與并行區別

并發:兩個或多個事件在同一時間間隔發生,或者說交替做不同事件的能力,或者說不同的代碼塊交替執行。并行:兩個或者多個事件在同一時刻發生,或者說同時做不同事件的能力,或者說不同的代碼塊同時執行。

并發和并行的意義

并發和并行都可以處理“多任務”,二者的主要區別在于是否是“同時進行”多個的任務。但是涉及到任務分解(有先后依賴耦合度高的任務無法做到并行)、任務運行(可能要考慮互斥、鎖、共享等)、結果合并。

Python下的多線程

在Python多線程下,每個線程的執行方式,如下:

獲取GIL切換到這個線程去執行運行代碼,這里有兩種機制:指定數量的字節碼指令(100個)固定時間15ms線程主動讓出控制把線程設置為睡眠狀態釋放GIL再次重復以上步驟

在Python2中,在解釋器解釋執行任何Python代碼時,都需要先獲得這把鎖才行(同一時間只會有一個獲得了GIL的線程在跑,其它的線程都處于等待狀態等著GIL的釋放),在遇到I/O操作時會釋放這把鎖。如果是純計算的程序,沒有I/O操作,解釋器會每隔100次操作就釋放這把鎖,讓別的線程有機會執行(這個次數可以通過sys.setcheckinterval來調整)也正是這種設定,是的多線程的CPU密集型計算非常雞肋,下面會講到為何如此。

而在python3中,GIL不使用ticks計數(100次,釋放GIL),改為使用計時器(執行時間達到15ms閾值后,當前線程釋放GIL),使得執行計算的次數更多,釋放次數減少,這樣對CPU密集型程序更加友好,但依然沒有解決GIL導致的同一時間只能執行一個線程的問題,所以效率依然不盡如人意。

那么是不是Python的多線程是雞肋嘛?

CPU密集型(各種循環處理、計數等等),在這種情況下,ticks計數很快就會達到閾值,然后觸發GIL的釋放與再競爭(多個線程來回切換是需要消耗資源的),所以python下的多線程對CPU密集型代碼并不友好,會觸發相當頻繁的線程切換。

IO密集型(文件處理、網絡爬蟲等),多線程能夠有效提升效率(單線程下有IO操作會進行IO等待,造成不必要的時間浪費,而開啟多線程能在線程A等待時,自動切換到線程B,可以不浪費CPU的資源,從而能提升程序執行效率,一個線程獲得GIL發送消息,然后等待返回消息(阻塞),Python此時釋放GIL,其他線程得到GIL發送消息,然后同樣等待返回消息(阻塞)......,這樣保證了IO傳輸過程時間的合理利用,減少了IO等待造成的資源浪費,提高IO傳輸效率)。所以python的多線程對IO密集型代碼比較友好。

有哪些結論?

I/O密集型使用多線程并發執行提高效率、計算密集型使用多進程(multiprocessing)并行執行提高效率。通常程序既包含IO操作又包含計算操作,那么這種情況下,在開始并發任務之前,可以先進行測試,測試多線程、多進程哪個效率高就是用哪種方式。

請注意:多核多線程比單核多線程更差,多核多進程下,CPU1釋放GIL后,其他CPU上的線程都會進行競爭,但GIL可能會馬上又被CPU1拿到,CPU2釋放GIL后……,導致其他幾個CPU上被喚醒后的線程會醒著等待到切換時間后又進入待調度狀態,這樣會造成線程顛簸(thrashing),導致效率更低。

多線程下的CPU密集型計算也不是無藥可醫,可以利用ctypes繞過GIL,ctypes可以使py直接調用任意的C動態庫的導出函數。所要做的只是把關鍵部分用C/C++寫成Python擴展。而且,ctypes會在調用C函數前釋放GIL。

同時,可以了解下協程,又稱微線程。

協程最大的優勢就是協程極高的執行效率。因為子程序切換不是線程切換,而是由程序自身控制,因此,沒有線程切換的開銷,和多線程比,線程數量越多,協程的性能優勢就越明顯。

第二大優勢就是不需要多線程的鎖機制,因為只有一個線程,也不存在同時寫變量沖突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比多線程高很多。

因為協程是一個線程執行,那怎么利用多核CPU呢?最簡單的方法是多進程+協程,既充分利用多核,又充分發揮協程的高效率,可獲得極高的性能。

好了,本文到此結束,如果可以幫助到大家,還望關注本站哦!

返回列表
上一篇:
下一篇: