2013-08-22 3 views
1

요청 처리기에서 새 프로세스가 subprocess.Popen에 의해 생성되는 경우 SimpleHTTPRequestHandler에서 요청의 반환이 차단된다는 이상한 문제가 있습니다. 하지만 Popen이 비동기식이어서는 안됩니까?Subprocess.Popen이 SimpleHTTPServer.SimpleHTTPRequestHandler의 응답을 차단하는 이유

동작은 SLES 시스템에서뿐만 아니라의 ActivePython 2.6로 내 OS X의 시스템에서 파이썬 2.6.7를 사용하여 다음 파일로 재현 : webserver.py :

#!/usr/bin/env python 
import SimpleHTTPServer 
import SocketServer 
import subprocess 
import uuid 

class MyRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): 
    def do_POST(self): 
     print 'in do_POST' 
     uuid_gen = str(uuid.uuid1()) 
     subprocess.Popen(['python', 'sleep.py']) 
     print 'subprocess spawned' 
     return self.wfile.write(uuid_gen) 

Handler = MyRequestHandler 

server = SocketServer.TCPServer(('127.0.0.1', 9019), Handler) 

server.serve_forever() 

sleep.py :

import time 
time.sleep(10) 

지금은 웹 서버를 시작하고 localhost로 컬 POST 요청을 수행 할 때 : 즉시 웹 서버 인쇄 9019 :

$python2.6 webserver2.py 
in do_POST 
subprocess spawned 

하지만 난 곱슬 곱슬 요청을 콘솔에 다음과 같은 동작을 보여줍니다 나는 파이썬 2.7과 같은 설치 프로그램을 실행하면

$curl -X POST http://127.0.0.1:9019/ 
<wait ~10 seconds> 
cd8ee24a-0ad7-11e3-a361-34159e02ccec 

대답은 즉시 컬 사이트에 도착합니다. Popen이 인쇄물을 막지는 않았지만 반환 만했기 때문에 어떻게 될 수 있습니까? 문제는 필자가 파이썬 2.6을 기존의 이유로 묶었 기 때문에 요청을 즉시 반환 할 수있는 가장 좋은 방법은 무엇입니까?

+2

이것은 상대적 일 수 있습니다. http://stackoverflow.com/questions/3973789/why-does-a-background-task-block-the-response-in-simplehttpserver –

+0

감사합니다. 그걸 보지 못했습니다. 그러나 콘텐츠 길이를 보내는 것에 대한 대답은 실제로 문제를 해결하지 않습니다. 컬은 헤더 (컨텐츠 길이)를 즉시 인쇄하지만 uuid는 약 10 초 후에 여전히 도착합니다. – alexanderfranke

+0

self.send_response (200) 및 콘텐츠 길이 헤더가 함께 문제를 해결하는 것 같습니다. – alexanderfranke

답변

0

Nikhil이이 질문에 나를 언급 한 후 https://stackoverflow.com/questions/3973789/... 나는 self.send_response (200), self.send_header ("Content-Length", str (len (uuid_gen))) 및 self.end_headers(). 이 작업 코드를 의미

은 다음과 같습니다

#!/usr/bin/env python 
import SimpleHTTPServer 
import SocketServer 
import subprocess 
import uuid 

class MyRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): 
    def do_POST(self): 
     print 'in do_POST' 
     uuid_gen = str(uuid.uuid1()) 
     subprocess.Popen(['python', 'sleep.py']) 
     print 'subprocess spawned' 
     self.send_response(200) 
     self.send_header("Content-Length", str(len(uuid_gen))) 
     self.end_headers() 
     self.wfile.write(uuid_gen) 

Handler = MyRequestHandler 

server = SocketServer.TCPServer(('127.0.0.1', 9019), Handler) 

server.serve_forever() 

문제는 HTTP 연결이 파이프 라인에 대한 개방되는 것 같았다, 내가 왜 수익 정확히 여전히 매우 확실하지 않다하더라도 Popen 프로세스가 완료되었습니다.