python如何判斷遠程文件是否存在 Python多進程和多線程是雞肋嘛?
Python多進程和多線程是雞肋嘛?GIL的存在一直備受爭議,這使得Python程序無法真正利用現(xiàn)代操作系統(tǒng)的多進程特性。需要注意的是,I/O圖形處理和NumPy數(shù)學計算等耗時的操作都發(fā)生在GIL之外
Python多進程和多線程是雞肋嘛?
GIL的存在一直備受爭議,這使得Python程序無法真正利用現(xiàn)代操作系統(tǒng)的多進程特性。需要注意的是,I/O圖形處理和NumPy數(shù)學計算等耗時的操作都發(fā)生在GIL之外,基本上不受影響。真正受影響的是Python字節(jié)碼的執(zhí)行,GIL會導致性能瓶頸。簡而言之,只有當純Python用于CPU密集型多線程時,GIL才會成為問題。
什么是GIL?Python s代碼執(zhí)行由Python虛擬機控制(也叫解釋器主循環(huán),CPython版本)。Python最初被設計成只有一個線程在解釋器主循環(huán)中運行。也就是說,每個CPU在任何時候都只有一個線程在解釋器中運行。對Python虛擬機的訪問由全局解釋鎖GIL控制,它控制一次只能運行一個線程。-單核CPU下的多線程其實是并發(fā)的,不是并行的。
并發(fā)和并行的區(qū)別
并發(fā)性:兩個或多個事件在同一時間間隔內發(fā)生,或者交替做不同的事件,或者交替執(zhí)行不同的代碼塊的能力。并行性:兩個或多個事件同時發(fā)生,或者同時執(zhí)行不同事件,或者同時執(zhí)行不同代碼塊的能力。
并發(fā)和并行的含義
并發(fā)和并行都可以處理 "多任務 ",兩者的主要區(qū)別在于多任務是否 "同時進行 "。但是涉及到任務分解(有順序依賴耦合度高的任務不能并行)、任務操作(互斥、加鎖、共享等。),以及結果合并。
Python中的多線程在Python多線程下,每個線程的執(zhí)行模式如下:
有兩種機制可以獲得GIL并切換到這個線程來執(zhí)行正在運行的代碼:指定數(shù)量的字節(jié)碼指令(100)和15毫秒的固定時間。線程主動放棄控制,并將線程設置為睡眠狀態(tài)以釋放GIL。再次重復上述步驟。在Python2中,當解釋器解釋任何Python代碼的執(zhí)行時,都需要先獲得這個鎖(只有一個獲得了GIL的線程在同時運行,其他所有線程都在等待GIL發(fā)布)。如果是沒有I/O操作的純計算程序,解釋器會每100次操作釋放一次鎖,讓其他線程有機會執(zhí)行(這個數(shù)字可以通過調整)。正是這樣的設定,多線程CPU密集型計算顯得很雞肋,下面就說說為什么。
在python3中,GIL不使用滴答來計數(shù)(100次,釋放GIL),而是使用定時器來代替(執(zhí)行時間達到15ms閾值后,當前線程釋放。放GIL),使得計算次數(shù)更多,釋放次數(shù)更少,對CPU密集型程序更友好,但還是沒有解決GIL一次只能執(zhí)行一個線程的問題,所以效率還是不盡如人意。
Python s多線程一個雞肋?CPU密集型(各種循環(huán)處理,計數(shù)等。),在這種情況下,滴答數(shù)很快就會達到閾值,然后觸發(fā)GIL的釋放和重新競爭(多線程來回切換需要資源),所以python中的多線程對CPU密集型代碼并不友好,會觸發(fā)相當頻繁的線程切換。
IO密集型(文件處理、網絡爬蟲等。),多線程可以有效提高效率(如果單線程下有IO操作,就會等待IO,造成不必要的時間浪費,而開啟多線程可以在線程A等待的同時自動切換到線程B,不會浪費CPU資源,從而提高程序執(zhí)行效率。一個線程從GIL獲得一個消息,然后等待返回消息(阻塞),Python在這個時候釋放GIL。其他線程得到GIL發(fā)送的消息,然后等待返回消息(阻塞)........................................................................................................................................................所以python 的多線程對IO密集型代碼很友好。
結論是什么?I/O密集型使用多線程并發(fā)執(zhí)行提高效率,計算密集型使用多處理并行執(zhí)行提高效率。通常程序中既包含IO操作,又包含計算操作,所以這種情況下,在開始并發(fā)任務之前,可以先測試一下,測試一下多線程多進程哪種方法效率高。
請注意:多核多線程比單核多線程差。多核多進程下,CPU1釋放GIL后,其他CPU上的線程會競爭,但GIL可能馬上被CPU1拿走。CPU2釋放GIL后,其他CPU上被喚醒的線程會被喚醒,等待切換時間后再進入待調度狀態(tài),這樣會導致線程抖動,效率降低。
多線程下的CPU密集型計算并非不可救藥。ctypes可以繞過GIL,讓py直接調用C動態(tài)庫的任何導出函數(shù)。我們要做的就是用C/C把關鍵部分寫成Python擴展,而且ctypes會在調用C函數(shù)之前釋放GIL。
同時可以了解下一個進程,也就是微線程。
協(xié)成最大的優(yōu)勢就是極高的執(zhí)行效率。因為子程序切換不是線程切換,而是由程序本身控制,所以沒有線程切換的開銷。與多線程相比,線程越多,協(xié)程的性能優(yōu)勢就越明顯。
第二個優(yōu)點是不需要多線程鎖定機制,因為只有一個線程,不存在同時寫變量的,共享資源在進程中不加鎖控制,只是判斷狀態(tài),所以執(zhí)行效率比多線程高很多。
因為進程是一個線程執(zhí)行的,如何使用多核CPU?最簡單的方法就是多進程協(xié)調,既充分利用了多核,又充分發(fā)揮了協(xié)調的高效率,可以獲得極高的性能。
python webservice服務接口參數(shù)?
傳遞對象參數(shù)(方法1)
通過查看遠程方法,發(fā)現(xiàn)fun接口的參數(shù)類型是paramType,它有兩個屬性,P1和P2。
客戶端客戶端(url)
(參數(shù)類型)
m.p1