unable to run more than one tornado process
Question: I've developed a tornado app but when more than one user logs in it seems to
log the previous user out. I come from an Apache background so I thought
tornado would either spawn a thread or fork a process but seems like that is
not what is happening.

To mitigate this I've installed nginx and configured it as a reverse proxy to
forward incoming requests to an available tornado process. Nginx seems to work
fine however when I try to start more than one tornado process using a
different port I get the following error:

    
    
    http_server.listen(options.port)
    File "/usr/local/lib/python2.7/dist-packages/tornado/tcpserver.py", line 125, in listen
    sockets = bind_sockets(port, address=address)
    File "/usr/local/lib/python2.7/dist-packages/tornado/netutil.py", line 145, in bind_sockets
    sock.bind(sockaddr)
    File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
    socket.error: [Errno 98] Address already in use
    

basically i get this for each process I try to start on a different port.

I've read that I should use supervisor to manage my tornado processes but I'm
thinking that is more of a convenience. At the moment I'm wondering if the
problem has to do with my actual tornado code or my setup somewhere? My python
code looks like this:

    
    
    from tornado.options import define, options
    define("port", default=8000, help="run on given port", type=int)
    ....
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()
    

my handlers all work fine and I can access the site when I go to
localhost:8000 just need a pair of fresh eyes please. ;)


Answer: Well I solved the problem. I had .sh file that tried to start multiple
processes with:

    
    
    python initpumpkin.py --port=8000&
    python initpumpkin.py --port=8001&
    python initpumpkin.py --port=8002&
    python initpumpkin.py --port=8003&
    

unfortunately I didn't tell tornado to parse the command line options so I
would always get that address always in use error since port '8000' was
defined as my default port, so it would attempt to listen on that port each
time. In order to mitigate this make sure to declare
tornado.options.parse_command_line() after main:

    
    
    if __name__ == "__main__":
        tornado.options.parse_command_line()
    

then run from the CLI with whatever arguments.

