多執行緒下的IO操作

2021-10-06 15:06:47 字數 2475 閱讀 4372

今天考慮優化專案中檔案操作,專案中有許多批量刪除檔案的操作,當檔案很多時,刪除操作會比較費時(1s~2s的時間也顯得有點慢了),更何況10s以上,想要通過多執行緒來同時處理多個檔案的刪除,在程式中使用了threadpool和parallel想要加速刪除,但是效果並沒有預期的明顯,總耗時甚至還有所提公升。

先看使用普通迴圈刪除目錄的**:

var dir = directory.

getdirectories

("d:\\filestore1\\",""

, searchoption.topdirectoryonly)

; console.

writeline

($"一共個目錄");

stopwatch stopwatch =

newstopwatch()

; stopwatch.

start()

;foreach

(var temp in dir)

stopwatch.

stop()

; console.

writeline

("耗時:"

+stopwatch.elapsedmilliseconds+

"毫秒");

console.

writeline

("操作完畢"

);

執行結果:

然後我們使用parallel試一下:

var dir = directory.

getdirectories

("d:\\filestore1\\",""

, searchoption.topdirectoryonly)

; console.

writeline

($"一共個目錄");

stopwatch stopwatch =

newstopwatch()

; stopwatch.

start()

; parallel.

foreach

(dir,

(temp)

=>);

stopwatch.

stop()

; console.

writeline

("耗時:"

+stopwatch.elapsedmilliseconds+

"毫秒");

console.

writeline

("操作完畢"

);

執行結果:

可以看到,確實快了6秒左右,但是這和我們的預期差的遠,還有乙個用threadpool執行的,但是無法確定總執行時間,所以就只貼**算了:

var dir = directory.

getdirectories

("d:\\filestore1\\",""

, searchoption.topdirectoryonly)

; console.

writeline

($"一共個目錄");

stopwatch stopwatch =

newstopwatch()

; stopwatch.

start()

;foreach

(var temp in dir)))

;}stopwatch.

stop()

; console.

writeline

("耗時:"

+stopwatch.elapsedmilliseconds+

"毫秒");

console.

writeline

("操作完畢"

);

enmmmm…到底咋回事兒,原本20多秒的操作,用了多執行緒還是20多秒,這時候我們就應該考慮檔案讀寫操作的底層機制了,要知道剛剛我們的io操作都是針對磁碟進行操作的,而磁碟操作全靠磁碟的磁頭來尋道定位,乙個磁碟只有乙個磁頭(現在計算機磁碟都有多個磁頭)

那麼問題來了,我們每個執行緒都要對磁頭進行操作,乙個磁頭只能為乙個執行緒使用,如果只有乙個磁頭的話,我們開再多執行緒也要排隊使用啊,所以,對於io操作使用多執行緒,具體速度有沒有提公升,很大程度上取決於磁碟(磁頭數),不過,使用多執行緒確實可以讓檔案操作在後台執行,提公升使用者體驗。

「多執行緒IO」和「單執行緒非同步IO」的對比

順手寫了個程式對比了一下多執行緒io和單執行緒非同步io的效能差異。需要說明的是,linux上目前的非同步io是由使用者態執行緒模擬的。目前核心原生的aio和glibc中的非同步io都有缺陷,libeio目前感覺比較好 因為nodejs在用 單執行緒非同步io指的是主線程中控制io的 全部都是在主線...

多執行緒同步I O和單執行緒非同步I O

2014 08 24 同步i o與非同步i o 執行緒在執行中如果遇到磁碟讀寫或網路通訊 統稱io操作 通常要耗費較長的時間,這時os會剝奪此執行緒的cpu控制權,使其暫停執行,同時將資源讓給其他的工作執行緒,這種執行緒排程方式稱為阻塞。當i o操作完畢時,作業系統將這個執行緒的阻塞狀態解除,恢復其...

python 多執行緒偽 多執行緒筆記 偽非同步IO

bio的時候,乙個客戶端對應伺服器的一條執行緒,比較耗執行緒資源.在此基礎上,對起執行緒進行優化,建立乙個執行緒池,對執行緒進行管理,可以設定乙個最大執行緒數 maxthreadcount.這樣,達到執行緒可控的目的.即使外面有遠大於執行緒數的連線過來,也不至於讓伺服器撐爆.多出的客戶端,就進入執行...