title: Run multiple asgi apps in same thread with uvicorn
body: <p>I want to run a starlette and django app in the same thread. </p>
  
  <p>(Having them in same thread allows fast thread-local communication between them).</p>
  
  <p>Considering that asgi apps are just coroutines, I thought this should be theoretically possible with <code>asyncio.gather()</code>.</p>
  
  <hr>
  
  <p>I came up with a little hack to make this work, but it has some limitations.</p>
  
  <pre class="lang-py prettyprint-override"><code>from uvicorn import Server, Config
  
  configs = [Config(app1, uds='app1.sock'), Config(app2, uds='app2.sock')]
  coros = [Server(c).serve() for c in configs]
  
  await asyncio.gather(*coros)
  </code></pre>
  
  <hr>
  
  <ol>
  <li>Doesn't support <code>reload</code> and <code>workers</code> options.</li>
  <li>Ctrl+C only works for one app.</li>
  </ol>
  
  <pre><code>INFO:     Started server process [86066]
  INFO:     Waiting for application startup.
  INFO:     Started server process [86066]
  INFO:     Waiting for application startup.
  INFO:     ASGI 'lifespan' protocol appears unsupported.
  INFO:     Application startup complete.
  INFO:     Uvicorn running on unix socket app1.sock (Press CTRL+C to quit)
  INFO:     Application startup complete.
  INFO:     Uvicorn running on unix socket app2.sock (Press CTRL+C to quit)
  ^CINFO:     Shutting down
  INFO:     Finished server process [86066]
  ^C^C^C^C^C
  </code></pre>
  
  <p>What's a better way to do this?</p>