Yes, thread pools are unfortunately necessary evils.<br><br>Twisted comes with a few tools to handle the use cases we're discussing. The 1:1 equivalent for call_on_thread would be deferToThread/deferToThreadPool (deferToThread == deferToThreadPool except with the default thread pool instead of a specific one).<br>

<br>There are a few other tools:<br><br>- spawnProcess (equiv to subprocess module, except with async communication with the subprocess)<br>- cooperative multitasking, such (twisted.internet.task.) Cooperator and coiterate: basically resumable tasks that are explicit about where they can be paused/resumed<br>

- third party tools such as corotwine, giving stackless-style coroutines, or ampoule, giving remote subprocesses<br><br>The more I learn about other stuff the more I see that everything is the same because everything is different :)<br>

<br><div class="gmail_quote">On Sat, Oct 27, 2012 at 12:27 PM, Kristján Valur Jónsson <span dir="ltr"><<a href="mailto:kristjan@ccpgames.com" target="_blank">kristjan@ccpgames.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Yes, stacklesslib provides this functionality with the call_on_thread() api, which turns a blocking operation into a non-blocking one.  This is also useful for cpu bound operations, btw.  For example, in EVE, when we need to do file operations and zipping of local files, we do it using this api.<br>


<span class="HOEnZb"><font color="#888888">K</font></span><br></blockquote></div><br>-- <br>cheers<div>lvh</div><br>