Ответ 1
Twisted имеет неблокирующую запись в файловых дескрипторах. Если вы пишете асинхронный код, я бы предположил, что вы все равно используете скрученный.:)
Есть ли простой способ записи в файл асинхронно в Python?
Я знаю, что файл io, который поставляется с Python блокирует; в большинстве случаев это нормально. Для этого конкретного случая мне нужно написать, чтобы не блокировать приложение вообще или, по крайней мере, как можно минимально.
Twisted имеет неблокирующую запись в файловых дескрипторах. Если вы пишете асинхронный код, я бы предположил, что вы все равно используете скрученный.:)
Как я понимаю, асинхронный ввод-вывод не совсем такой же, как неблокирующий ввод-вывод.
В случае неблокирующего ввода-вывода, когда дескриптор файла настроен как "неблокирующий", системный вызов read()
(например) вернет EWOULDBLOCK
(или EAGAIN
), если операция чтения блокирует вызывающий процесс для завершения операции. Системные вызовы select()
, poll()
, epoll()
и т.д. Предоставляются для того, чтобы процесс мог попросить ОС рассказать, когда один или несколько файловых дескрипторов становятся доступными для выполнения некоторых операций ввода-вывода.
Асинхронный ввод-вывод работает путем очередности запроса на ввод-вывод в дескриптор файла, отслеживаемого независимо от вызывающего процесса. Для файлового дескриптора, поддерживающего асинхронный ввод-вывод (типичные файлы с необработанным диском), процесс может вызвать aio_read()
(например), чтобы запросить чтение нескольких байтов из дескриптора файла. Системный вызов немедленно возвращается, независимо от того, завершился ли ввод-вывод. Спустя некоторое время процесс затем обследует операционную систему для завершения ввода-вывода (то есть буфер заполняется данными).
Процесс (однопоточный), который выполняет только неблокирующий ввод-вывод, сможет читать или писать из одного дескриптора файла, который готов для ввода-вывода, когда другой не готов. Но процесс все равно должен синхронно выдавать системные вызовы для выполнения ввода-вывода во все готовые дескрипторы файлов. Принимая во внимание, что в асинхронном вводе-выводе процесс просто проверяет завершение ввода-вывода (буфер заполняется данными). При асинхронном вводе-выводе ОС имеет право работать как можно больше, чтобы обслуживать ввод-вывод, если он так выбирает.
С этим, существуют ли какие-либо оболочки для POSIX aio_read/write и т.д. системные вызовы для Python?
Я разрабатываю ставки aio.h для python: pyaio
Он работает только с linux.
У Python 3 есть такая функциональность. См. PEP 3116.