1. 程式人生 > >python 為什麼io密集要用多執行緒

python 為什麼io密集要用多執行緒

【多執行緒為什麼能提高效率(I/O密集):一個執行緒可以操作很多內容--獲得IO資源---加工IO資源,如果使用多執行緒去操作一塊io資源,雖然有gil,但是在很短的時間內,io資源能分給很多執行緒,然後剩餘的io資源的加工操作,多執行緒幾乎是並行的,只不過是io資源獲取這塊是併發獲取的(因為gil)】

IO傳輸過程分為:傳送訊息,等待返回訊息。python多執行緒在處理io的時候,一個執行緒獲得GIL傳送訊息,然後等待返回訊息(阻塞),python此時釋放GIL, 其他執行緒得到GIL傳送訊息,然後同樣等待返回訊息(阻塞)......,這樣保證了IO傳輸過程時間的合理利用,提高io傳輸效率。

但是多核下,多核多執行緒比單核單執行緒更差,原因是單核下多執行緒,每次釋放GIL喚醒的那個執行緒都能獲得GIL鎖,能夠無縫執行,但多核下,CPU釋放GIL後,其他CPU上的執行緒都會進行競爭,但GIL可能被CPU0拿到,導致其他幾個CPU上被喚醒的執行緒會醒著等待到切換時間後又進入待排程狀態,這樣會造成執行緒顛簸,導致效率更低。

【所以多執行緒適合單核IO密集型】

為了高效利用多核,python引入多程序(原因是,每個程序有自己獨立的GIL,互不干擾,這樣就可以真正意義上的並行執行,所以在python中,多程序的執行效率優先於多執行緒(僅僅對多核cpu而言))

所以在這裡說結論:多核下,想做並行提升效率,比較通用的方法是使用多程序,能夠有效提高執行效率。

【另外,在邏輯功能比較多的程式中,為了防止主程式被掛起,其他的功能需被封裝為函式讓執行緒去開啟(開多個),其中一個功能阻塞,其他的也能執行下去】

參考自:靜覓 » Python爬蟲進階五之多執行緒的用法

相關推薦

python 為什麼io密集執行

【多執行緒為什麼能提高效率(I/O密集):一個執行緒可以操作很多內容--獲得IO資源---加工IO資源,如果使用多執行緒去操作一塊io資源,雖然有gil,但是在很短的時間內,io資源能分給很多執行緒,然後剩餘的io資源的加工操作,多執行緒幾乎是並行的,只不過是io資源獲取這塊

Java為什麼執行

用多執行緒只有一個目的,那就是更好的利用cpu的資源,因為所有的多執行緒程式碼都可以用單執行緒來實現。說這個話其實只有一半對,因為反應“多角色”的程式程式碼,最起碼每個角色要給他一個執行緒吧,否則連實際場景都無法模擬,當然也沒法說能用單執行緒來實現:比如最常見的“生產者,消費

java中為什麼執行

我們可以在計算機上執行各種計算機軟體程式。每一個執行的程式可能包括多個獨立執行的執行緒(Thread)。 執行緒(Thread)是一份獨立執行的程式,有自己專用的執行棧。執行緒有可能和其他執行緒共享一些資源,比如,記憶體,檔案,資料庫等。 當多個執行緒同時讀寫同一份共享資源

【什麼時候執行——IO篇】io執行真的會降低磁碟效能麼?

什麼叫做IO? IO是在主存與外部裝置(磁碟驅動器、終端和網路)之間的資料拷貝的過程。 站在主存的角度去看,I表示輸入到主存;O從主存輸出。 什麼叫做IO密集型? 就是IO很多唄。比如大量的“資料寫入磁碟,資料上傳到遠端伺服器,從磁碟讀取檔案”等操作。 2.磁碟IO

python 念聽網mp3執行工下載

#coding=utf-8 import requests import threading import re class downloader: # 建構函式 def __init__(self,downloadurl): # 設定url

【OS大作業】執行統計txt檔案中字元個數(Java實現)

問題描述 給定一個txt檔案,利用不同個數的執行緒查詢檔案中某字元的個數,探究執行緒個數與查詢時間的關係。 本作業程式碼使用JAVA實現,版本為10.0.2,使用的IDE為Eclipse4.9.0. 結果測試所用的txt檔案內容為英文,編碼格式為UTF-8。 原始碼 第一版程式碼:(

python技巧——使用threadpool實現執行並行

可以使用 threadpool 來實現多程序並行。 示例 我想用多執行緒求一個數列的和,可以如下操作: import threadpool def func(dic, c): dic['count'] += c if __name__=="__main__":

Python併發程式設計系列之執行

1引言 2 建立執行緒   2.1 函式的方式建立執行緒   2.2 類的方式建立執行緒 3 Thread類的常用屬性和方法   3.1 守護執行緒:Deamon   3.2 join()方法 4 執行緒間的同步機制   4.1 互斥鎖:Lock   4.2 遞迴鎖:RLock   4.3

Python 實用程式設計技巧(執行篇)

一、GIL(global_interpreter_lock) 1.概念: Python 一開始為了簡單,在多執行緒程式設計的時候會在我們的直譯器上加一個非常大的鎖,也就是允許我們一次只有一個執行緒執行在一個CPU上,gil 就能實現在同一時刻只有一個執行緒在CPU上執行位

Python並行程式設計(十):執行效能評估

1、基本概念       GIL是CPython直譯器引入的鎖,GIL在直譯器層面阻止了真正的並行執行。直譯器在執行任何執行緒之前,必須等待當前正在執行的執行緒釋放GIL,事實上,直譯器會強迫想要執行的執行緒必須拿到GIL才能訪問直譯器的任何資源,例如棧或Python物件等,這也正是GIL的目的,為了阻止不同

Python爬蟲(十八)_執行糗事百科案例

多執行緒糗事百科案例 案例要求參考上一個糗事百科單程序案例:http://www.cnblogs.com/miqi1992/p/8081929.html Queue(佇列物件) Queue是python中的標準庫,可以直接import Queue引用;佇列時執行緒間最常用的互動資料的形式。 pytho

java執行批次查詢大量資料(Callable返回資料)方式

   我看到有的資料庫是一萬條資料和八萬條資料還有十幾萬條,幾百萬的資料,然後我就想拿這些資料測試一下,發現如果用java和資料庫查詢就連一萬多條的資料查詢出來就要10s左右,感覺太慢了。然後網上都說各種加索引,加索引貌似是有查詢條件時在某個欄位加索引比較快一些,但是畢竟是人

為什麼使用執行執行的優點和缺點是什麼?

首先說下多執行緒出現的原因: 為了解決負載均衡問題,充分利用CPU資源.為了提高CPU的使用率,採用多執行緒的方式去同時完成幾件事情而不互相干擾.為了處理大量的IO操作時或處理的情況需要花費大量的

Python爬蟲入門教程,執行採集鬥圖啦表情包!

寫在前面 今天在CSDN部落格,發現好多人寫爬蟲都在爬取一個叫做鬥圖啦的網站,裡面很多表情包,然後瞅了瞅,各種實現方式都有,今天我給你實現一個多執行緒版本的。關鍵技術點 aiohttp ,你可以看一下我前面的文章,然後在學習一下。 https://github.com/wangde

執行實現使用者同時收發的簡單socket服務端

簡單的socket程式碼和多執行緒練習用socket服務端和多執行緒實現可以連線多個客戶端並同時收發的功能。這裡要用到socket 和 threading所以,記得:import socket, threading一、建立socket服務端首先,按正常操作,建立一個socke

python核心程式設計-練習】| 執行程式設計

1. 程序與執行緒。執行緒與程序的區別是什麼? 什麼是程式? 計算機程式只不過是磁碟中可執行的,二進位制(或其它型別)的資料。程式是靜態的,可修改的檔案資料; 什麼是程序? 程序是程式被讀取到記憶體中,被作業系統呼叫的時候程式的一次執行過程

Java執行--三個執行分別列印a,b,c.請執行實現迴圈列印15次abc

掃盲: 想想自己多執行緒解決生產消費者問題就知道個synchronized,真是慚愧 為做此題目特意學習新的多執行緒知識–ReentrantLock跟synchronized一樣都是Java中的可重入鎖(可以在內部鎖中拿到外部鎖) Con

python爬蟲進階使用執行爬取小說

Python多執行緒,thread標準庫。都說Python的多執行緒是雞肋,推薦使用多程序。 Python為了安全考慮有一個GIL。每個CPU在同一時間只能執行一個執行緒      GIL的全稱是Global Interpreter

Java執行實現賣票

    Java小白一個,剛開始學習執行緒,在這個過程中遇到了一些麻煩,經過2天的努力,終於弄懂了用多執行緒實現賣票的程式,嗯嗯,記錄一下!public class TicketImpDemo { public static void main(String[] args)

一行 Python 實現並行化 -- 日常執行操作的新思路

春節坐在回家的火車上百無聊賴,偶然看到 Parallelism in one line 這篇在 Hacker News 和 reddit 上都評論過百的文章,順手譯出,enjoy:-) http://www.zhangzhibo.net/2014/02/01/