2014-07-17 80 views
0

我有簡單的Twisted webserver應用程序服務我的數學請求。一切都做工精細(我躲在大碼片未涉及到我的問題):多線程內部請求扭曲_delayedRender

#import section ... 

class PlsPage(Resource): 
    isLeaf = True 

    def render_POST(self, request): 
     reactor.callLater(0, self._delayedRender, request) 
     return NOT_DONE_YET 

    def _delayedRender(self, request): 

     #some actions before 
     crossval_scores = cross_validation.cross_val_score(pls1, X, y=numpy.asarray(Y), scoring=my_custom_scorer, cv=KFold(700, n_folds=700)) 
     #some actions after 

     request.finish() 

reactor.listenTCP(12000, server.Site(PlsPage())) 
reactor.run() 

當我試圖通過例如設置n_jobs加快cross_validation計算爲3

crossval_scores = cross_validation.cross_val_score(pls1, X, y=numpy.asarray(Y), scoring=my_custom_scorer, cv=KFold(700, n_folds=700), n_jobs=3) 

後我得到了3個例外:

twisted.internet.error.CannotListenError:無法偵聽任何:12000:[Errno 10048]通常只允許使用每個套接字地址(協議/網絡地址/端口) 。

由於某些原因,我無法在_delayedRender內使用n_jobs> 1調用cross_val_score。 這裏是異常的追溯,由於某些原因reactor.listenTCP試圖啓動3次。

Exception traceback

任何想法如何得到它的工作?

UPD1。我創建文件PLS.py搬到了這裏所有的代碼,除了最後2行:

from twisted.web import server 
from twisted.internet import reactor, threads 
import PLS 

reactor.listenTCP(12000, server.Site(PLS.PlsPage())) 
reactor.run() 

但問題仍然存在。我還發現這個問題只存在於Windows上。我的Linux機器很好地運行這些腳本。

回答

4

scikit_learn顯然使用multiprocessing模塊來實現併發。 multiprocessing使用pickle在進程之間傳輸數據,其中包括其他...特殊問題,它會導致父進程中導入的一些模塊被導入到工作進程中。

您的PLS_web.py然而,「模塊」實際上並不是一個模塊,它是一個腳本;由於您已將reactor.listenTCPreactor.run放在底部,所以當您導入它時,實際上會執行而不是僅加載其代碼。

此特定錯誤是因爲您的Web服務器正在運行4次(一次用於控制器進程,一次用於三次作業中的每一次),因此第一臺服務器是第一臺服務器已經偵聽端口12000

你應該在別處刪除reactor.run/reactor.listenTCP線,成爲一個頂級腳本。一條很好的經驗法則是,這些行不應該與classdef語句出現在同一個文件中;在一個地方定義你的代碼並在另一個地方啓動它。一旦你將它移動到一個沒有被導入的文件中(你甚至可能想要把它放在一個不是合法模塊標識符的文件中,例如run-my-server.py),那麼multiprocessing可能能夠導入所有文件它需要的代碼並完成其工作。

更好的是,不要寫這些行,寫一個twisted application plugin並運行您的程序twistd。如果你不需要把reactor.run陳述放在任何地方,你就不能把它放在錯誤的地方:)。

+0

感謝您的解釋。但問題仍然存在,我更新了這個問題。我還發現我只在Windows中出現異常。我的linux服務器很好地運行這個代碼。 –

+1

在Windows上,執行多處理時,任何「主」代碼都應該由'if __name__ =='__main __''來保護。這是一個非常着名的問題;谷歌爲它。 –

+0

感謝雕文@larsmans現在可以工作。 –