Stop Building Synchronous Web Containers
Seriously, stop it. It's surreally difficult to build a sane ansynchronous service on top of a synchronous API, but building a synchronous service on top of an asynchronous API is easy.
-
WSGI: container calls the application as a function, and uses the return value for the response body. Asynchronous apps generally use a non-WSGI base (see for example Bottle).
-
Rack: container calls the application as a method, and uses the return value for the complete response. Asynchronous apps generally use a non-Rack base (see this Github ticket).
-
Java Servlets: container calls the application as a method, passing a callback-bearing object as a parameter. The container commits and closes the response as soon as the application method returns. Asynchronous apps can use a standard API that operates by re-invoking the servlet method as needed.
-
What does .Net do?
vs
- ExpressJS: container calls the application as a function, passing a callback-bearing object as a parameter. The application is responsible for indicating that the response is complete.
Synchronous web containers are bad API design
-
Make the easy parts easy (this works)
-
Make the hard parts possible (OH SHIT)
Writing synchronous adapters for async APIs is easy
def adapter(request, response_callback):
synchronous_response = synchronous_entry_point(request)
return response_callback(synchronous_response)
Going the other way is more or less impossible, which is why websocket support, HTML5 server-sent event support, and every other async tool for the web has an awful server interface.