- N +

python多線程例子簡單(rocksdb多線程例子)

大家好,感謝邀請,今天來為大家分享一下python多線程例子簡單的問題,以及和rocksdb多線程例子的一些困惑,大家要是還不太明白的話,也沒有關(guān)系,因?yàn)榻酉聛韺榇蠹曳窒恚M梢詭椭酱蠹遥鉀Q大家的問題,下面就開始吧!

python異步協(xié)程跟多進(jìn)程、多線程哪個效率高

Python多線程就別想高效了,因?yàn)橛幸粋€GIL大鎖在,執(zhí)行不能并發(fā)。

排除了一個,剩下異步對比多進(jìn)程。哪個效率高,主要取決于是不是計(jì)算密集的任務(wù),以及進(jìn)程間通信有多頻繁。

還要記得,單一進(jìn)程的異步,滿負(fù)荷也只有一個核在工作,而多進(jìn)程是有可能利用多核的能力的。

最后,多進(jìn)程和異步是可以混合用的,這樣的結(jié)構(gòu)跟Go就有點(diǎn)類似了,很可能是效率最佳的組合。

python中的多線程和JAVA中的多線程有什么區(qū)別嗎

python是支持多線程的,但是python里的多線程是單cpu意義上的多線程,它和多cpu上的多線程有著本質(zhì)的區(qū)別,這是因?yàn)閜ython存在一個叫GlobalInterpreterLock(GIL)全局解釋器鎖。

在解釋器解釋執(zhí)行任何Python代碼時,都需要先獲得這把鎖,也就是說在同一時刻內(nèi),只有一條線程可以在CPU中運(yùn)行。

但是python的多線程并不是毫無用處的。當(dāng)遇到I/O操作時會釋放這把GIL鎖,所以如果程序是一個IO密集型的程序,一個線程處在IO等待的時候另一個線程便可以取得鎖并在CPU中運(yùn)行,這時就發(fā)揮了多線程的作用。

但如果是純計(jì)算的程序,沒有I/O操作,那么只有取得GIL鎖的線程可以在CPU中運(yùn)行,其它的線程都處于等待狀態(tài),等待持有GIL鎖的線程的釋放鎖,也就相當(dāng)于單線程在跑(而且上下文切換也會有所開銷)。

Java方面,其提供了并發(fā)機(jī)制:一個進(jìn)程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù)。因?yàn)榫€程運(yùn)行于多核CPU上,各線程可分布于CPU的各個核心,所以可以讓程序?qū)崿F(xiàn)真正的并發(fā)。

以上就是python和java多線程的區(qū)別,希望我的回答對你有所幫助。

python的多線程是怎么實(shí)現(xiàn)的,聽說底層是依據(jù)win32的線層實(shí)現(xiàn)

python使用GlobalInterpreterLock,簡稱GIL,把守解釋器的大門,同時保護(hù)CAPI的調(diào)用,假如有A,B,C三個線程同時運(yùn)行,如果A線程進(jìn)入了解釋器,GIL會把B,C擋在大門之外,在線程調(diào)度的時候,會重新調(diào)度一個線程進(jìn)入解釋器,至于何時調(diào)度,調(diào)用sys.getcheckinterval()查看,這個也可以通過set來設(shè)置,至于調(diào)度哪個線程,這個則完全交給操作系統(tǒng)去做,從原理上看,就是模擬了操作系統(tǒng)的原生線程。

python selenium多線程怎么用

不同的線程創(chuàng)建不同的driver,也可以創(chuàng)建相同的

在C++中多線程調(diào)用python函數(shù),有什么辦法

的確有多線程調(diào)用的沖突問題。

通常是初始化一個python解釋器。作為全局變量。然后每個線程分別調(diào)用。因?yàn)閜ython解釋器里有一個GIL的全局鎖。所以要防止線程間因?yàn)镚IL造成的死鎖。不過具體的使用方法,與單線程沒有區(qū)別。初始化python解釋器。然后加載腳本,運(yùn)行,取得返回變量就可以了。如果你使用system,就當(dāng)我沒有說。即使是使用system,也會有多線程的沖突可能性。因?yàn)椴僮飨到y(tǒng)的管道管理,相關(guān)文件,相關(guān)數(shù)據(jù)庫,臨時文件等都可能會產(chǎn)生沖突。

Python多進(jìn)程和多線程是雞肋嘛

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

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

并發(fā)與并行區(qū)別

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

并發(fā)和并行的意義

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

Python下的多線程

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

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

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

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

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

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

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

有哪些結(jié)論?

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

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

多線程下的CPU密集型計(jì)算也不是無藥可醫(yī),可以利用ctypes繞過GIL,ctypes可以使py直接調(diào)用任意的C動態(tài)庫的導(dǎo)出函數(shù)。所要做的只是把關(guān)鍵部分用C/C++寫成Python擴(kuò)展。而且,ctypes會在調(diào)用C函數(shù)前釋放GIL。

同時,可以了解下協(xié)程,又稱微線程。

協(xié)程最大的優(yōu)勢就是協(xié)程極高的執(zhí)行效率。因?yàn)樽映绦蚯袚Q不是線程切換,而是由程序自身控制,因此,沒有線程切換的開銷,和多線程比,線程數(shù)量越多,協(xié)程的性能優(yōu)勢就越明顯。

第二大優(yōu)勢就是不需要多線程的鎖機(jī)制,因?yàn)橹挥幸粋€線程,也不存在同時寫變量沖突,在協(xié)程中控制共享資源不加鎖,只需要判斷狀態(tài)就好了,所以執(zhí)行效率比多線程高很多。

因?yàn)閰f(xié)程是一個線程執(zhí)行,那怎么利用多核CPU呢?最簡單的方法是多進(jìn)程+協(xié)程,既充分利用多核,又充分發(fā)揮協(xié)程的高效率,可獲得極高的性能。

關(guān)于本次python多線程例子簡單和rocksdb多線程例子的問題分享到這里就結(jié)束了,如果解決了您的問題,我們非常高興。

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