Подтвердить что ты не робот

Возможна ли асинхронная запись файлов в python?

Есть ли простой способ записи в файл асинхронно в Python?

Я знаю, что файл io, который поставляется с Python блокирует; в большинстве случаев это нормально. Для этого конкретного случая мне нужно написать, чтобы не блокировать приложение вообще или, по крайней мере, как можно минимально.

4b9b3361

Ответ 2

Как я понимаю, асинхронный ввод-вывод не совсем такой же, как неблокирующий ввод-вывод.

В случае неблокирующего ввода-вывода, когда дескриптор файла настроен как "неблокирующий", системный вызов read() (например) вернет EWOULDBLOCK (или EAGAIN), если операция чтения блокирует вызывающий процесс для завершения операции. Системные вызовы select(), poll(), epoll() и т.д. Предоставляются для того, чтобы процесс мог попросить ОС рассказать, когда один или несколько файловых дескрипторов становятся доступными для выполнения некоторых операций ввода-вывода.

Асинхронный ввод-вывод работает путем очередности запроса на ввод-вывод в дескриптор файла, отслеживаемого независимо от вызывающего процесса. Для файлового дескриптора, поддерживающего асинхронный ввод-вывод (типичные файлы с необработанным диском), процесс может вызвать aio_read() (например), чтобы запросить чтение нескольких байтов из дескриптора файла. Системный вызов немедленно возвращается, независимо от того, завершился ли ввод-вывод. Спустя некоторое время процесс затем обследует операционную систему для завершения ввода-вывода (то есть буфер заполняется данными).

Процесс (однопоточный), который выполняет только неблокирующий ввод-вывод, сможет читать или писать из одного дескриптора файла, который готов для ввода-вывода, когда другой не готов. Но процесс все равно должен синхронно выдавать системные вызовы для выполнения ввода-вывода во все готовые дескрипторы файлов. Принимая во внимание, что в асинхронном вводе-выводе процесс просто проверяет завершение ввода-вывода (буфер заполняется данными). При асинхронном вводе-выводе ОС имеет право работать как можно больше, чтобы обслуживать ввод-вывод, если он так выбирает.

С этим, существуют ли какие-либо оболочки для POSIX aio_read/write и т.д. системные вызовы для Python?

Ответ 3

Я разрабатываю ставки aio.h для python: pyaio

Он работает только с linux.

Ответ 4

У Python 3 есть такая функциональность. См. PEP 3116.