Yay WSGI. Honestly, I thought that had happened years ago.
Whether threads or greenlets or coroutines, you'd have a connection per logical thread of control and each thread has its own cache. If you have lots of logical threads (threads, greenlets, coroutines), you'll want smaller caches. At PloneConf I mentioned an idea for letting objects in separate caches share copy-on-write state.
ZServer/zope.server/waitress use an architecture that's fairly common, at least in the Java world. Use an async library for I/O and a thread pool for application logic. IDK other WSGI servers provide this. It wouldn't be too hard to put a thread pool behind an async server.
Speaking of async libraries, my favorite is still gevent. Jason Madden runs a Zope 3-based (I think) application on gevent without change. Of course, you still need to be aware of how many connections you're using.
Remember, when using sexy aysyncio, computation will block all your I/O.