Jumping in to correct one fact.
On Tue, May 5, 2015 at 12:44 PM, Brett Cannon firstname.lastname@example.org wrote:
On Tue, May 5, 2015 at 3:14 PM Paul Moore email@example.com wrote:
Well, twisted always had defer_to_thread. Asyncio has run_in_executor, but that seems to be callback-based rather than coroutine-based?
The run_in_executor call is not callback-based -- the confusion probably stems from the name of the function argument ('callback'). It actually returns a Future representing the result (or error) of an operation, where the operation is represented by the function argument. So if you have e.g. a function
def factorial(n): return 1 if n <= 0 else n*factorial(n-1)
you can run it in an executor from your async(io) code like this:
loop = asyncio.get_event_loop() result = yield from loop.run_in_executor(factorial, 100)
(In a PEP 492 coroutine substitute await for yield from.)