요청 처리기에서 새 프로세스가 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을 기존의 이유로 묶었 기 때문에 요청을 즉시 반환 할 수있는 가장 좋은 방법은 무엇입니까?
이것은 상대적 일 수 있습니다. http://stackoverflow.com/questions/3973789/why-does-a-background-task-block-the-response-in-simplehttpserver –
감사합니다. 그걸 보지 못했습니다. 그러나 콘텐츠 길이를 보내는 것에 대한 대답은 실제로 문제를 해결하지 않습니다. 컬은 헤더 (컨텐츠 길이)를 즉시 인쇄하지만 uuid는 약 10 초 후에 여전히 도착합니다. – alexanderfranke
self.send_response (200) 및 콘텐츠 길이 헤더가 함께 문제를 해결하는 것 같습니다. – alexanderfranke