2014-07-17 2 views
0

나는 수학 요청을 처리하는 간단한 Twisted 웹 서버 응용 프로그램을 가지고 있습니다. 잘 작동 모든 (내 질문에 관련이없는 큰 코드 조각을 숨기) :Twisted _delayed 요청 내 멀티 스레드 호출

#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() 

내가 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) 

이후에, 예를 들어 n_jobs를 설정하여 cross_validation 계산 속도를하려고

twisted.internet.error.CannotListenError : 수신 대기 할 수 없음 : 12000 : [Errno 10048] 각 소켓 주소 (프로토콜/네트워크 주소/포트)의 한 가지 용도 만 정상적으로 허용됩니다. .

_delayedRender에서 n_jobs> 1 인 cross_val_score를 호출 할 수없는 이유가 있습니다. 몇 가지 이유 때문에 reactor.listenTCP가 3 번 시작하려고하는 예외의 추적입니다.

Exception traceback

모든 아이디어를 어떻게 작동하려면?

UPD1. 나는 PLS.py을 파일을 생성하고 마지막 두 줄을 제외하고, 여기에 모든 코드를 이동 :

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

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

하지만 문제가 지속. 또한이 문제는 Windows에서만 지속되는 것으로 나타났습니다. 내 리눅스 머신은이 스크립트를 잘 실행한다.

답변

4

scikit_learn은 동시성을 위해 multiprocessing 모듈을 사용합니다. multiprocessingpickle을 사용하는 프로세스간에 데이터를 전송합니다. 다른 원인 중 ... 특이한 문제로 인해 부모 프로세스에서 가져온 일부 모듈이 작업자 프로세스로 가져옵니다.

PLS_web.py "모듈"은 실제로 모듈이 아니며 스크립트입니다. reactor.listenTCPreactor.run을 맨 아래에 넣었으므로 코드를로드하는 대신 실제로 을 가져옵니다.

이 오류는 웹 서버가 컨트롤러 프로세스에 대해 한 번, 세 번의 작업마다 한 번씩 실행되므로 첫 번째 서버가 첫 번째 서버가 이미 포트 12000에서 수신 대기 중입니다.

다른 곳의 reactor.run/reactor.listenTCP 행은 최상위 스크립트로 제거해야합니다. 엄지 손가락의 좋은 규칙은이 줄이 class 또는 def 문과 같은 파일에 나타나서는 안됩니다. 한 곳에서 코드를 정의하고 다른 곳에서 코드를 시작하십시오. 가져 오지 않은 파일로 이동 한 다음 (예 : run-my-server.py과 같이 이름이 올바른 모듈 식별자가 아닌 파일에 저장하려는 경우) multiprocessing 모두 가져올 수 있습니다. 필요한 코드와 작업을 수행합니다.

더 나은 것은 아니지만이 줄을 쓰지 말고 twisted application plugin을 작성하고 twistd으로 프로그램을 실행하십시오. 어떤 장소에 reactor.run 문을 넣을 필요가 없다면 잘못된 위치에 넣을 수 없습니다 :).

+0

설명해 주셔서 감사합니다. 그러나 문제는 여전히 지속되며 질문을 업데이트했습니다. 나는 또한 Windows에서만 예외가 있다는 것을 발견했다. 내 리눅스 서버는이 코드를 잘 실행한다. –

+1

Windows에서 "주 코드"는 다중 처리를 할 때'if __name__ == '__main __''에 의해 보호되어야합니다. 이것은 매우 잘 알려진 문제입니다. 그것을 위해 Google. –

+0

Thanks Glyph, @larsmans, 이제 작동합니다. –