Search code examples
pythonmultithreadingwebserver

Multithreaded webserver in Python


An example from a video lecture. Background: the lecturer gave a simplest web server in python. He created a socket, binded it, made listening, accepted a connection, received data, and send it back to the client in uppercase. Then he said that there is a drawback: this web server is single-threaded. Then let's fork.

I can't understand the example well enough. But to start with, the program exits (sys.exit()). But I can't run it again:

socket.error: [Errno 98] Address already in use.

I try to find out which process is listening on port 8080: netstat --listen | grep 8080. Nothing.

Well, what is listening on 8080? And how to kill it?

Added later: There is a feeling that if I wait for some time (say, 5-10 minutes), I can run the program again.

import os
import socket
import sys


server_socket = socket.socket()
server_socket.bind(('', 8080))
server_socket.listen(10)
print "Listening"


while True:
    client_socket, remote_address = server_socket.accept()
    print "PID: {}".format(os.getpid())
    child_pid = os.fork()
    print "child_pid {}".format(child_pid)

    if child_pid == 0:    
        request = client_socket.recv(1024)
        client_socket.send(request.upper())
        print '(child {}): {}'.format(client_socket.getpeername(), request)
        client_socket.close()
        sys.exit()
    else:
        client_socket.close()

server_socket.close()

Solution

  • The correct netstat usage is:

    netstat -tanp
    

    because you need the -a option to display listening sockets. Add grep to locate your program quickly:

    netstat -tanp| grep 8080