2012-08-05 3 views
3

다음과 같은 문제가 있습니다. 나는 실이 거의 없다. 종료 호출과 스레드 (파일을 업로드하는 하위) 만 기다리는 주 스레드가 있습니다. 불행히도 어린이 스레드는 특정 서버에 연결할 때 차단됩니다. 리눅스에서 python2.7을 사용합니다.파이썬 멀티 스레딩 - 메인 스레드 블록 socket.connect

메인 스레드는이 코드가 들어

for i in xrange(n): 
     upl = UploaderThread(self.user, self.password) 
     upl.start() 
    while threading.active_count() > 1: 
     time.sleep(1000.) 

을 그리고이 아이 스레드 내가 무슨 일을합니까

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.settimeout(glob_timeout) 
    #this fragment of code is accessed 
    sock.connect(("95.211.193.147", 8084)) <- here the child-thread is blocked 
    #this fragment of code is not accessed anymore 
    sock.send(header) 

을 걸 조각인가?


같은 프로그램 (모든 사본은 하나의 업로드 스레드)을 거의 실행하지 않으면 모든 것이 정상입니다. 즉, 서버는 하나의 클라이언트에서 여러 연결을 허용합니다.

for i in xrange(n): 
     upl = UploaderThread(self.user, self.password) 
     upl.start() 

그런 다음 메인 쓰레드의 죽음 이후, 모든 아이 thread 작품 (이다 : 나는 (대기 루프를 제거하는)이 방법으로 메인 스레드를 변경하면 기본 스레드 즉 이 없을 때

모든 작동 더 이상 차단되지 않음).

다른 서버 ("95.211.193.147", 8084가 아닌)와 연결을 시도하면 하위 스레드는 주 스레드에 의해 차단되지 않습니다.

나는 실제로 무슨 일이 벌어지고 있는지 이해하지 못합니다. UploaderThread

class UploaderThread(threading.Thread): 
    def __init__(self, user, password): 
     threading.Thread.__init__(self) 
     self.uploader = Uploader(user, password) 
     self.daemon  = False 

    def run(self): 
     self.uploader.upload_dir() 

및 self.uploader.upload_dir()의


정의는 서버에 연결 코드가 포함되어 있습니다.

+0

자식 스레드가 하나씩 실행되는 경우 소켓 서버가 멀티 스레드되지 않을 수 있습니다 – xiaowl

+0

문제는 업로드하는 스레드를 하나만 고소하면 문제가되지 않습니다. 모든 하위 스레드가 그 위치에서 차단 된 경우 자식 스레드를 시작한 후 주 스레드를 제거하면 모든 문제가 해결됩니다. 그러나 나는 메인 스레드를 유지하고 싶다. – Anonim33

+1

GIL이 그 일을하고 있습니까? 파이썬에서 스레딩이 어떻게 작동하는지 알고 있습니까? 한 번에 하나의 스레드 만 실행되고 GIL은 특정 시간에 다른 스레드에 제어 권한을 부여합니다. –

답변

0

스레딩 대신 멀티 프로세싱 라이브러리를 사용하는 것이 좋습니다. 제한이 있지만 GIL 문제를 피할 수 있습니다.

관련 문제