日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

说说GIL

發布時間:2024/1/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 说说GIL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一篇:線程深入篇引入

Code:https://github.com/lotapp/BaseCode/tree/master/python/5.concurrent/Thread/3.GIL

說說GIL

盡管Python完全支持多線程編程, 但是解釋器的C語言實現部分在完全并行執行時并不是線程安全的,所以這時候才引入了GIL

解釋器被一個全局解釋器鎖保護著,它確保任何時候都只有一個Python線程執行(保證C實現部分能線程安全) GIL最大的問題就是Python的多線程程序并不能利用多核CPU的優勢 (比如一個使用了多個線程的計算密集型程序只會在一個單CPU上面運行)

注意:GIL只會影響到那些嚴重依賴CPU的程序(比如計算型的)如果你的程序大部分只會涉及到I/O,比如網絡交互,那么使用多線程就很合適 ~ 因為它們大部分時間都在等待(線程被限制到同一時刻只允許一個線程執行這樣一個執行模型。GIL會根據執行的字節碼行數和時間片來釋放GIL,在遇到IO操作的時候會主動釋放權限給其他線程)

所以Python的線程更適用于處理I/O和其他需要并發執行的阻塞操作,而不是需要多處理器并行的計算密集型任務(對于IO操作來說,多進程和多線程性能差別不大)計算密集現在可以用Python的Ray框架

網上摘取一段關于IO密集和計算密集的說明:(IO密集型可以結合異步)

計算密集型任務的特點是要進行大量的計算,消耗CPU資源,比如計算圓周率、對視頻進行高清解碼等等,全靠CPU的運算能力。這種計算密集型任務雖然也可以用多任務完成,但是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低,所以,要最高效地利用CPU,計算密集型任務同時進行的數量應當等于CPU的核心數。計算密集型任務由于主要消耗CPU資源,因此,代碼運行效率至關重要。Python這樣的腳本語言運行效率很低,完全不適合計算密集型任務。對于計算密集型任務,最好用C語言編寫。第二種任務的類型是IO密集型,涉及到網絡、磁盤IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低于CPU和內存的速度)。對于IO密集型任務,任務越多,CPU效率越高,但也有一個限度。常見的大部分任務都是IO密集型任務,比如Web應用。IO密集型任務執行期間,99%的時間都花在IO上,花在CPU上的時間很少,因此,用運行速度極快的C語言替換用Python這樣運行速度極低的腳本語言,完全無法提升運行效率。對于IO密集型任務,最合適的語言就是開發效率最高(代碼量最少)的語言,腳本語言是首選,C語言最差。

Process and Thread Test

其實用不用多進程看你需求,不要麻木使用,Linux下還好點,Win下進程開銷就有點大了(好在服務器基本上都是Linux,程序員開發環境也大多Linux了)這邊只是簡單測了個啟動時間差距就來了,其他的都不用測試了

測試Code:

from time import sleep from multiprocessing import Processdef test(i):sleep(1)print(i)def main():t_list = [Process(target=test, args=(i, )) for i in range(1000)]for t in t_list:t.start()if __name__ == '__main__':main()

運行時間:

real 0m3.980s user 0m2.034s sys 0m3.119s

操作系統幾千個進程開銷還是有點大的(畢竟進程是有上線的)ulimit -a

測試Code:

from time import sleep from multiprocessing.dummy import Processdef test(i):sleep(1)print(i)def main():t_list = [Process(target=test, args=(i, )) for i in range(1000)]for t in t_list:t.start()if __name__ == '__main__':main()

運行時間:

real 0m1.130s user 0m0.158s sys 0m0.095s

multiprocessing.dummy里面的Process上面也說過了,就是在線程基礎上加點東西使得用起來和multiprocessing的Process編程風格基本一致(本質還是線程)

測試Code:

from time import sleep from multiprocessing.dummy import threadingdef test(i):sleep(1)print(i)def main():t_list = [threading.Thread(target=test, args=(i, )) for i in range(1000)]for t in t_list:t.start()if __name__ == '__main__':main()

運行時間:

real 0m1.123s user 0m0.154s sys 0m0.085s

其實Redis就是使用單線程和多進程的經典,它的性能有目共睹。所謂性能無非看個人能否充分發揮罷了。不然就算給你轟炸機你也不會開啊?扎心不老鐵~

PS:線程和進程各有其好處,無需一棍打死,具體啥好處可以回顧之前寫的進程和線程篇~


利用共享庫來擴展

C系擴展

GIL是Python解釋器設計的歷史遺留問題,多線程編程,模型復雜,容易發生沖突,必須用鎖加以隔離,同時,又要小心死鎖的發生。Python解釋器由于設計時有GIL全局鎖,導致了多線程無法利用多核。計算密集型任務要真正利用多核,除非重寫一個不帶GIL的解釋器(PyPy)如果一定要通過多線程利用多核,可以通過C擴展來實現(Python很多模塊都是用C系列寫的,所以用C擴展也就不那么奇怪了

只要用C系列寫個簡單功能(不需要深入研究高并發),然后使用ctypes導入使用就行了:

#include <stdio.h> void test() { while(1){} }

編譯成共享庫:gcc 2.test.c -shared -o libtest.so

使用Python運行指定方法:(太方便了,之前一直以為C#調用C系列最方便,用完Python才知道更簡方案)

from ctypes import cdll from os import cpu_count from multiprocessing.dummy import Pooldef main():# 加載C共享庫(動態鏈接庫)lib = cdll.LoadLibrary("./libtest.so")pool = Pool() # 默認是系統核數pool.map_async(lib.test, range(cpu_count()))pool.close()pool.join()if __name__ == '__main__':main()

看看這時候HTOP的信息:(充分利用多核)【ctypes在調用C時會自動釋放GIL

Go擴展

利用Go寫個死循環,然后編譯成so動態鏈接庫(共享庫):

package main import "C"//export test func test(){for true{} }func main() {test() }

非常重要的事情://export test一定要寫,不然就被自動改成其他名字(我當時被坑過)

Python調用和上面一樣:

from ctypes import cdll from os import cpu_count from multiprocessing.dummy import Pooldef main():# 加載動態鏈接庫lib = cdll.LoadLibrary("./libtestgo.so")pool = Pool() # 默認是系統核數pool.map_async(lib.test, range(cpu_count()))pool.close()pool.join()if __name__ == '__main__':main()

效果:go build -buildmode=c-shared -o libtestgo.so 2.test.go


題外話~如果想等CPython的GIL消失可以先看一個例子:MySQL把大鎖改成各個小鎖花了5年。在是在MySQL有專門的團隊和公司前提下,而Python完全靠社區重構就太慢了

速度方面微軟除外,更新快本來是好事,但是動不動斷層更新,這學習成本就太大了(這也是為什么Net能深入的人比較少的原因:人家剛深入一個,你就淘汰一個了...)

可能還有人不清楚,貼下官方推薦技術吧(NetCore、Orleans、EFCore、ML.Net、CoreRT)

https://github.com/aspnet/AspNetCorehttps://github.com/aspnet/EntityFrameworkCorehttps://github.com/dotnet/machinelearninghttps://github.com/dotnet/orleanshttps://github.com/aspnet/Mvchttps://github.com/dotnet/corert

課外拓展:

用go語言給python3開發模塊 https://www.jianshu.com/p/40e069954804 https://blog.filippo.io/building-python-modules-with-go-1-5Python與C/C++相互調用 https://www.cnblogs.com/apexchu/p/5015961.html使用C/C++代碼編寫Python模塊 https://www.cnblogs.com/silvermagic/p/9087896.html快速實現python c擴展模塊 https://www.cnblogs.com/chengxuyuancc/p/6374239.htmlPython的C語言擴展 https://python3-cookbook.readthedocs.io/zh_CN/latest/chapters/p15_c_extensions.htmlpython調用golang生成的so庫 https://studygolang.com/articles/10228 https://www.cnblogs.com/huangguifeng/p/8931837.htmlpython調用golang并回調 https://blog.csdn.net/gtd138/article/details/79801235Python3.x AttributeError: libtest.so: undefined symbol: fact https://www.cnblogs.com/tanglizi/p/8965230.html

運行在其他編譯器上

先看最重要的一點,一旦運行在其他編譯器意味著很多Python第三方庫可能就不能用了,相對來說PyPy兼容性是最好的了

如果是Python2系列我推薦谷歌的grumpy

Grumpy是一個 Python to Go 源代碼轉換編譯器和運行時。旨在成為CPython2.7的近乎替代品。關鍵的區別在于它將Python源代碼編譯為Go源代碼,然后將其編譯為本機代碼,而不是字節碼。這意味著Grumpy沒有VM已編譯的Go源代碼是對Grumpy運行時的一系列調用,Go庫提供與 Python C API類似的目的

如果是Python3系列,可以使用PyPy PythonNet Jython3 ironpython3等等

PyPy:https://bitbucket.org/pypy/pypy

Net方向:

https://github.com/pythonnet/pythonnet https://github.com/IronLanguages/ironpython3

Java方向:

https://github.com/jython/jython3

Other:

源碼:https://github.com/sbinet/go-python 參考:https://studygolang.com/articles/13019可惜CoreRT一直沒完善,不然就Happy了 https://github.com/dotnet/corert

經驗:平時基本上多線程就夠用了,如果想多核利用-多進程基本上就搞定了(分布式走起)實在不行一般都是分析一下性能瓶頸在哪,然后寫個擴展庫

如果需要和其他平臺交互才考慮上面說的這些項目。如果是Web項目就更不用擔心了,現在哪個公司還不是混用?JavaScript and Python and Go or Java or NetCore。基本上上點規模的公司都會用到Python,之前都是Python and Java搭配使用,這幾年開始慢慢變成Python and Go or NetCore搭配使用了~

下集預估:Actor模型 and 消息發布/訂閱模型

轉載于:https://www.cnblogs.com/dunitian/p/9780821.html

總結

以上是生活随笔為你收集整理的说说GIL的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成年人看的视频网站 | 可以在线观看的黄色 | a级国产毛片| 爱爱免费网站 | 另类尿喷潮videofree | 日韩一区二区三区四区五区 | 日本亚洲黄色 | 中文亚洲欧美 | 日本性爱视频在线观看 | 性激烈视频在线观看 | 青春草在线视频免费观看 | 深爱五月激情五月 | 91麻豆产精品久久久久久夏晴子 | 噜噜色成人 | 欧美色图在线视频 | 青青操网 | 国产资源在线观看 | 国产男男gay体育生网站 | 亚洲一区二区国产精品 | 91高清在线免费观看 | 岛国精品一区二区 | 牛夜精品久久久久久久99黑人 | 91免费在线播放 | 国产一区色 | 小sao货大ji巴cao死你 | 久久久综合av | av小说天堂网 | 成人h视频 | 亚洲自拍偷拍精品视频 | www.在线看 | 亚洲国产三级 | 午夜影院体验区 | 欧美精品电影一区二区 | 亚欧激情 | 日日做夜夜爽毛片麻豆 | 在线91视频 | 中文字幕丝袜诱惑 | 二级黄色大片 | 精品无码久久久久成人漫画 | 午夜在线一区 | 欧美日韩精品久久久免费观看 | 河北彩花中文字幕 | 国产区一区二区三区 | 狠狠干导航 | 成人小视频免费观看 | 亚洲一二三区视频 | 插插插综合 | 亚洲一区二区三区四区五区xx | 中日韩在线播放 | 免费在线视频一区 | 美女啪啪动态图 | 邻居少妇张开腿让我爽了在线观看 | 五月天堂网 | 禁止18在线观看 | 日韩一区二区三区精品视频 | 桃花色综合影院 | 日本乱论视频 | 午夜刺激视频 | 波多野结衣中文字幕久久 | 成人h动漫精品一区 | 亚洲精品性 | av免费福利 | 艳妇臀荡乳欲伦交换在线看 | 欧美人与动物xxxx | 欧美成人影音 | 国产男男gay | 秋霞成人午夜鲁丝一区二区三区 | 国产成人欧美一区二区三区91 | 波多野结av衣东京热无码专区 | 欧美一级无毛 | 色偷偷影院 | 欧美人与性动交a欧美精品 日韩免费高清视频 | 日韩在线不卡av | 亚洲专区免费 | 亚洲欧洲久久久 | 日韩久久不卡 | 国产日韩欧美精品在线 | 欧美视频在线观看免费 | 亚洲第一黄色网址 | 男人天堂2019 | 人妻饥渴偷公乱中文字幕 | 久久精品色妇熟妇丰满人妻 | 人人草人人搞 | 制服丝袜影音先锋 | 超碰资源在线 | 日韩av在线播放网址 | 肉色丝袜脚交一区二区 | 国产欧美一区二区三区在线看 | 日本成人免费网站 | 亚洲天堂影视 | 久久国产精品影院 | 免费成人高清在线视频 | 国产在线视频二区 | 高清不卡毛片 | 九色精品| 青青视频免费在线观看 | 玖玖五月 | 男人天堂一区二区 | 无码人妻久久一区二区三区不卡 |