Aioexec is a simple, intuitive interface around the concurrent.futures
package and asyncio's loop.run_in_executor
method. Aioexec is leightweight, no dependencies and ~70 LOC.
aioexec requires Python >= 3.6
pip install aioexec
or
pipenv install aioexec
Without aioexec you usually run an executor something like this:
import aysncio
from concurrent.futures import ProcessPoolExecutor
# ...
loop = asyncio.get_event_loop()
foo = await loop.run_in_executor(
ProcessPoolExecutor(1), lambda: my_func(foo='baz')
)
With aioexec you would do the same like this:
import aysncio
from aioexec import Procs
# ...
foo = await Procs(1).call(my_func, foo='baz')
You can call a batch of functions in the same executor like this:
import asyncio as aio
from aioexec import Procs, Call
my_values = await aio.gather(
*Procs(3).batch(
Call(my_func, foo='1'),
Call(my_func, foo='2'),
Call(my_func, foo='3'),
)
This plays nicely with comprehensions:
my_values = await aio.gather(
*Procs(10).batch(
Call(my_func, foo=i) for i in range(0, 10)
)
It works the same for Threads:
import asyncio as aio
from aioexec import Threads
foo = await Threads(1).call(my_func, foo='baz')
If necessary, you can pass an event loop to the executors like this:
foo = await Threads(1, my_loop).call(my_func, foo='baz')
foo = await Procs(1, my_loop).call(my_func, foo='baz')
Just clone the repo and run:
pipenv install --dev