国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python用threading實現多線程詳解

2020-02-23 04:19:39
字體:
來源:轉載
供稿:網友

多線程

多線程是個提高程序運行效率的好辦法,本來要順序執行的程序現在可以并行執行,可想而知效率要提高很多。但是多線程也不是能提高所有程序的效率。程序的兩個極端是‘CPU 密集型'和‘I/O 密集型'兩種,多線程技術比較適用于后者,因為在串行結構中當你去讀寫磁盤或者網絡通信的時候 CPU 是閑著的,畢竟網絡比磁盤要慢幾個數量級,磁盤比內存慢幾個數量級,內存又比 CPU 慢幾個數量級。多線程技術就可以同時執行,比如你的程序需要發送 N 個 http 數據包(10 秒),還需要將文件從一個位置復制到另一個位置(20 秒),然后還需要統計另一個文件中'hello,world'字符串的出現次數(4 秒),現在一共是要用 34 秒。但是因為這些操作之間沒有關聯,所以可以寫成多線程程序,幾乎只需要 20 秒就完成了。這是針對 I/O 密集型的,如果是 CPU 密集型的就不行了。比如我的程序要計算 1000 的階乘(10 秒),還要計算 100000 的累加(5 秒),那么即使程序是并行的,還是會要用 15 秒,甚至更多。因為當程序使用 CPU 的時候 CPU 是通過輪轉來執行的,IO 密集型的程序可以在 IO 的同時用 CPU 計算,但是這里的 CPU 密集型就只能先執行一會兒線程 1 再執行一會兒線程 2。所以就需要 15 秒,甚至會更多,因為 CPU 在切換的時候需要耗時。解決 CPU 密集型程序的多線程問題就是 CPU 的事情了,比如 Intel 的超線程技術,可以在同一個核心上真正的并行兩個線程,所以稱之為‘雙核四線程'或者‘四核八線程',我們這里具體的先不談,談我也不知道。

Python 騙人

說了這么多多線程的好處,但是其實 Python 不支持真正意義上的多線程編程。在 Python 中有一個叫做 GIL 的東西,中文是 全局解釋器 ,這東西控制了 Python,讓 Python 只能同時運行一個線程。相當于說真正意義上的多線程是由 CPU 來控制的,Python 中的多線程由 GIL 控制。如果有一個 CPU 密集型程序,用 C 語言寫的,運行在一個四核處理器上,采用多線程技術的話最多可以獲得 4 倍的效率提升,但是如果用 Python 寫的話并不會有提高,甚至會變慢,因為線程切換的問題。所以 Python 多線程相對更加適合寫 I/O 密集型程序,再說了真正的對效率要求很高的 CPU 密集型程序都用 C/C++ 去了。

第一個多線程

Python 中多線程的庫一般用thread和threading這兩個,thread不推薦新手和一般人使用,threading模塊就相當夠用了。

有一個程序,如下。兩個循環,分別休眠 3 秒和 5 秒,串行執行的話需要 8 秒。

#!/usr/bin/env python# coding=utf-8import timedef sleep_3(): time.sleep(3)def sleep_5(): time.sleep(5)if __name__ == '__main__': start_time = time.time() print 'start sleep 3' sleep_3() print 'start sleep 5' sleep_5() end_time = time.time() print str(end_time - start_time) + ' s'            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 怀远县| 龙井市| 昌图县| 怀宁县| 江西省| 台中市| 万盛区| 文安县| 枞阳县| 无极县| 金溪县| 河南省| 阿坝县| 福泉市| 沾化县| 从江县| 东平县| 天祝| 衡东县| 汤原县| 顺义区| 星子县| 深水埗区| 久治县| 焦作市| 奉新县| 建平县| 台南市| 临桂县| 神农架林区| 修水县| 抚松县| 扎赉特旗| 扎兰屯市| 靖州| 高青县| 横峰县| 东平县| 肥东县| 新野县| 盱眙县|