1
나는 파이썬 웹 서버를 작성하는 튜토리얼을 따라왔다 : ruslanspivak.com/lsbaws-part3/.웹 서버 (파이썬)에서 다중 처리를 구현하는 방법은 무엇입니까?
이 클라이언트로 간단한 웹 페이지를 반환하고 연결을 종료 15 초 동안 기다리하도록되어
import os
import socket
import time
SERVER_ADDRESS = (HOST, PORT) = '', 8888
REQUEST_QUEUE_SIZE = 15
file = open("test.html", "r")
http_response = file.read()
def handle_request(client_connection):
request = client_connection.recv(1024)
print(
'Child PID: {pid}. Parent PID {ppid}'.format(
pid=os.getpid(),
ppid=os.getppid(),
)
)
#print(request.decode())
'''http_response = b"""\
HTTP/1.1 200 OK
Hello, World!
"""'''
client_connection.sendall(http_response)
time.sleep(15)
def serve_forever():
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind(SERVER_ADDRESS)
listen_socket.listen(REQUEST_QUEUE_SIZE)
print('Serving HTTP on port {port} ...'.format(port=PORT))
print('Parent PID (PPID): {pid}\n'.format(pid=os.getpid()))
while True:
client_connection, client_address = listen_socket.accept()
#print "parent is now accepting new clients"
pid = os.fork()
if pid == 0: # child
#print "aaaaaaaa", pid, "aaaaaaa"
listen_socket.close() # close child copy
handle_request(client_connection)
client_connection.close()
print ("child {pid} exits".format(pid=os.getpid()))
os._exit(0) # child exits here
else: # parent
print "parent process continues"
client_connection.close() # close parent copy and loop over
if __name__ == '__main__':
serve_forever()
멀티 프로세싱을 사용하여 요청을 처리하도록되어 파이썬 웹 서버에 대한 간단한 코드가있다. 15 초 동안 다른 클라이언트는 여전히 웹 페이지에 연결하여 수신 할 수 있어야하지만 다른 클라이언트가이를 수행하기 위해 이전 하위 프로세스가 끝날 때까지 기다려야하는 것처럼 보입니다.
적어도 4-5 명의 클라이언트가 이전 하위 프로세스가 끝날 때까지 기다리지 않고 웹 페이지를 가져올 수있는 진정한 다중 처리를 구현하려면 어떻게해야합니까?
(물론 내가 슬립() 함수를 제거 할 수 있습니다,하지만 그건 정말 문제가 해결되지 것)
스레드 사용 및 대신 다중 처리 사용 – Paul