Asynchronous execution of synchronous functions

Inada Naoki songofacandy at gmail.com
Mon Sep 26 22:22:43 EDT 2022


On Tue, Sep 27, 2022 at 3:19 AM Axy via Python-list
<python-list at python.org> wrote:
>
> > Did you check the ThreadPoolExecutor or the ProcessPoolExecutor? They
> > won't give you atomic writes unless you add a Lock or a Condition, but
> > they will execute your code in another thread or process.
>
> Yes, I did, but they are too complicated to use. I'd like something for
> humans, such as
>
> asynchronizer = InThreadExecutor()
>
> result = await asynchronizer.run(myfunc, myargs, mykwargs)
>

There are two convenient APIs in asyncio. asyncio.to_thread and run_in_executor.

to_thread creates and destroy a dedicated thread for the function.
run_in_executor uses threadpool owned by loop.

https://docs.python.org/3/library/asyncio-task.html?highlight=to_thread#asyncio.to_thread
https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.run_in_executor

>
> and I almost implemented that borrowing code from asyncsqlite (doves fly
> slowly, electric mail is even slower :)), but...
>
> > Keep in mind that Python's threads have a global interpreter lock
> > (GIL) that prevents full parallelism. Processes work as expected, but
> > require IPC and pickable objects in and out.
>
> yes, that became a problem.
>
> So, I revoke my question. Went out to redesign the whole approach.
>
> Thanks for reply!
>
> Axy.
> --
> https://mail.python.org/mailman/listinfo/python-list



-- 
Inada Naoki  <songofacandy at gmail.com>


More information about the Python-list mailing list