We never explicitly call end_request. We let our code be agnostic about threads and don't pay much attention. We don't keep shared resources in memory between requests. Because we're running in Apache, we have no idea if requests come in on the same thread or not.
I can tell you this: We have a poller set up from the client web browser, and as the poller makes requests, we can watch the number of connections increase.
WSGI settings might be in order. We have the WSGI settings below defined per VirtualHost, with <myapp> different for each VirtualHost. We have two copies of this python application on this server, and not much else.
WSGIDaemonProcess <myapp>
WSGIProcessGroup <myapp>
WSGIApplicationGroup %{GLOBAL}