2013-02-20 37 views
2

我必須做出suds異步運行, 我在想兩個想法:比較異步網址抓取與谷歌應用程序引擎線程的urllib2

  1. (容易)運行每個泡沫在不同的線程中調用,因爲GAE蟒蛇2.7運行時間allows吧。

  2. (更難)重寫泡沫LIB對異步網址上運行取

我想用第一種選擇,但不知道這是否會比第二個要慢得多。

也許有人更有經驗的GAE可以幫助我選擇?

UPDATE

結果必須是單一的網絡請求,所以我不能使用任務隊列/ MapReduce的/後端

+0

仍在使用SOAP的人? – Lipis 2013-02-20 16:58:36

+0

我喜歡GAE版本的泡泡,最好使用ndb異步。 ;) – tesdal 2013-02-20 20:28:50

回答

1

this question,泡沫是不是線程庫。所以你必須爲每個想要利用泡沫客戶端對象的線程創建一個新的客戶端。這就是說,選擇號碼1將是你最好的選擇。

此外,請查看here以獲取有關如何在GAE上使用緩存工作的信息。

UPDATE

其它技術嘗試(在你不需要在一個單一的Web請求的結果用例):

BackendsPull Queues:(使用此方法如果您打算不斷撥打電話)

創建始終在後端,將suds客戶端存儲在內存中,並不斷輪詢拉隊列以執行您需要執行的任務。這樣,您就可以推送應用程序需要完成的許多任務/調用,並有多個後端以小塊方式使用數據。

Task Queues

(如果你想嘗試,並把成本降到最低,並且不打算一直讓許多SOAP調用使用此方法)

創建任務,並讓AppEngine上執行你的需要跨越多個實例。只知道任務何時執行並不能保證,但根據我的經驗,這不是問題。

+0

但是,如果我的理解正確,兩種方式都很好,因爲我將保持單獨的客戶端實例每個異步調用。 但我的問題是,如果更容易的解決方案(1)與(2)解決方案相比會有性能下降? – krotkiewicz 2013-02-25 18:50:30

+0

根據我的經驗,最大的CPU命中是將我的WSDL文件加載到suds中(啓用memcache)。使用線程與NDB,恕我直言,開銷會微不足道。但是,使用NDB(上述方法2)在技術上應該比爲每個客戶端創建新線程(上述方法1)更快,特別是如果您已在應用程序中使用NDB。 IIRC,在生產中每個請求只能有10個異步URL抓取調用(我認爲這是每個請求,它可能是每個實例或應用程序) – someone1 2013-02-25 22:41:58

+0

我準備了一些測試(在此期間,我克隆了SUDS客戶端實例,所以我加載WSDL文件一次): 1.使一個SUDS呼叫 - 花費4s 2.使10個同步SUDS呼叫 - 花費40s 3.使10個異步SUDS呼叫 - 花費超過60s(DeadlineExceededError) 我想我'面臨GIL問題,因爲SUDS調用不僅是I/O綁定,而且也是CPU綁定(解析XML消息並創建SUDS結構)。 對嗎?我能做什麼 ? – krotkiewicz 2013-02-26 14:47:51

相關問題