asyncio - run coroutine in the background

Marko Rauhamaa marko at pacujo.net
Sat Feb 20 03:13:11 EST 2016


Paul Rubin <no.email at nospam.invalid>:

> Marko Rauhamaa <marko at pacujo.net> writes:
>> "Frank Millman" <frank at chagford.com>:
>>> I would love to drive the database asynchronously, but of the three
>>> databases I use, only psycopg2 seems to have asyncio support.
>> Yes, asyncio is at its infancy. There needs to be a moratorium on
>> blocking I/O.
>
> Unfortunately there appears to be no way to open a file in Linux
> without at least potentially blocking (slow disk or whatever). You
> need separate threads or processes to do the right thing.

I have been wondering about the same thing. It would appear that disk
I/O is considered nonblocking at a very deep level:

 * O_NONBLOCK doesn't have an effect

 * a process waiting for the disk to respond cannot receive a signal

 * a process waiting for the disk to respond stays in the "ready" state

Note that

 * most disk I/O operates on a RAM cache that is flushed irregularly

 * memory mapping and swapping make disk I/O and RAM access two sides of
   the same coin

 * page faults can turn any assembly language instruction into a
   blocking disk I/O operation

 * ordinary disks don't provide for much parallelism; processes are
   usually serialized for disk I/O

If the file system happens to be NFS, a networking issue may paralyze
the whole system.

...

On the networking side, there is also a dangerous blocking operation:
socket.getaddrinfo() (and friends). As a consequence, socket.bind(),
socket.connect() may block indefinitely. In fact, even asyncio's
BaseEventLoop.create_server() and BaseEventLoop.create_sonnection() may
block indefinitely without yielding.

SEE ALSO
    getaddrinfo_a(3)


Marko


More information about the Python-list mailing list