(很久以前)我寫了一個多線程的web-spider來同時啓用併發請求。那是在我的Python青年時代,在我知道GIL之前的日子以及它爲多線程代碼創建的相關困境(IE,大多數時候東西剛剛結束序列化!)...一個乾淨,輕量級的替代Python的扭曲?
我想修改此代碼以使其更健壯並且性能更好。基本上有兩種方法可以做到這一點:我可以在2.6+中使用新的multiprocessing module,或者我可以選擇某種基於反應堆/事件的模型。我寧願做更晚,因爲它更簡單,更不容易出錯。
所以這個問題涉及什麼框架最適合我的需求。以下是我知道的,到目前爲止選項列表:
- Twisted:Python的反應器框架的鼻祖:看起來複雜,有點臃腫不過。陡峭的學習曲線爲一個小任務。
- Eventlet:從lindenlab的傢伙。基於Greenlet的框架適用於這些類型的任務。儘管我看了一下代碼,但它並不太漂亮:非pep8兼容,分散打印(爲什麼人們在框架中這樣做?),API看起來有點不一致。
- PyEv:不成熟,現在似乎沒有人使用它,雖然它基於libevent,所以它有一個堅實的後端。
- asyncore:從stdlib:über的低級別,看起來像是一個涉及很多legwork只是爲了讓東西離開地面。
- tornado:雖然這是一款面向服務器的產品,專爲服務器動態網站而設計,但它的特色是async HTTP client和簡單的ioloop。看起來它可以完成工作,但不是它的目標。 [編輯:不能在Windows上運行不幸的是,它計算出來好嗎 - 它要求我支持這個跛腳平臺]
有什麼我已經錯過呢?當然,必須有一個圖書館適合簡化的異步網絡庫的甜蜜點!
[編輯:非常感謝intgr他指向this page。如果你滾動到底部,你會看到有一個非常好的項目列表,旨在以這種或那種方式解決這個任務。事實上,自Twisted成立以來事情確實發生了變化:現在人們似乎贊成基於co-routine的解決方案,而不是傳統的反應器/回調定向解決方案。這種方法的好處是更直接的代碼:我以前肯定發現,特別是在C++中使用boost.asio時,基於回調的代碼可能會導致難以遵循的設計,並且對未經訓練的代碼相對模糊眼。使用協同例程可以讓你編寫至少看起來更加同步的代碼。我想現在我的任務是弄清楚我喜歡這些圖書館中的哪一個,並給它一個去!很高興我現在問...]
[編輯:也許感興趣的人誰遵循或無意中發現了這個這個問題或關心這個話題在任何意義上:我發現the available tools當前狀態的一個真正偉大的書面記錄這份工作]
Python的* *是多線程的,它只是不允許兩個線程同時運行Python代碼。 – intgr
@Intgr:的確如此,理論上,因爲'socket'是一個C模塊,所以如果他們在調用底層例程之前讓GIL走,事情可能實際上是併發的。即使如此,我想我想回到單線程的東西。 – jkp
我從你的問題中學到的東西比從答案中學到的要多得多。 –