2010-11-18 73 views
0

我正在開發一個需要我創建多個線程來下載大型遠程文件的項目。我已經做到了這一點,但我無法理解,與僅使用單個線程相比,下載具有多個線程的文件需要更長的時間。我用我的xampp localhost來執行時間測試。我想知道它是正常行爲還是因爲我沒有嘗試從真實服務器下載。Python/Urllib2/Threading:單一下載線程比多個下載線程更快。爲什麼?

感謝 肯尼迪

+0

請提供一些數字。一次下載需要多長時間?兩個併發下載需要兩倍的時間?三次接管三倍?你在說什麼?請提供您所看到的號碼。另外,請提供多線程代碼的最小代碼片段。你做錯事的可能性很小。 – 2010-11-18 20:47:06

回答

4

9名婦女不能結合起來,使一個嬰兒一個月。如果你有10個線程,它們每個只有單線程帶寬的10%,並且存在額外的上下文切換開銷等。

+0

非常感謝。我現在得到它 – Kennedy 2010-11-19 04:03:52

1

Python線程使用某種稱爲GIL(Golbal解釋器鎖)的某些時候會降級程序執行時間。

沒有做很多的談話在這裏,我邀請您閱讀thisthis也許它可以幫助你瞭解你的問題,你還可以看到兩個會議herehere

希望這能幫助:)

+2

GIL在等待I/O時被釋放,所以它不是GIL怪異的情況。 – andreypopp 2010-11-18 22:42:07

+0

@andreypopp:你看過我的答案中的鏈接嗎?,當我們使用多核過程時,I/O綁定過程也會受到GIL的影響(內在地)天),我不想解釋所有我知道的有關GIL和I/O綁定以及CPU綁定過程的知識,因爲我教過視頻會議必須比我的可憐知識和英語好,所以看看鏈接,他們正在談論OP案例。 – mouad 2010-11-18 23:27:02

+0

感謝您的視頻。非常有幫助 – Kennedy 2010-11-19 01:38:00

1

扭曲使用非阻塞I/O,這意味着如果數據目前不可用插座上,並沒有阻止整個線程,這樣你就可以處理許多套接字連接同時在一個線程中等待I/O。但是,如果執行與I/O不同的操作(解析大量數據),仍然會阻塞該線程。

當您使用stdlib的套接字模塊時,它會阻塞I/O,這意味着當您撥打電話socket.read並且此時數據不可用時 - 它會阻塞整個線程,因此每個連接需要一個線程處理併發下載。

這兩種方法並行:

  • 叉了新的連接(threading + socket從STDLIB)新的線程。
  • Multiplex I/O和句柄可能在一個線程中連接(Twisted)。