Неблокирующий доступ к файлам с помощью Twisted

Я пытаюсь выяснить, есть ли шаблон defacto для доступа к файлам с использованием скрученного. Множество примеров, на которые я смотрел (twisted.python.log, twisted.persisted.dirdbm, twisted.web.static), по-видимому, не беспокоит блокировку доступа к файлам.

Похоже, что должен быть какой-то очевидный интерфейс, возможно, наследуемый от abstract.FileDescriptor, что весь доступ к файлам должен проходить через него как производитель / потребитель.

Я что-то пропустил или это просто то, что первичное использование для скрутки в асинхронном программировании – для сетевого взаимодействия, и оно на самом деле не было разработано для других операций дескриптора файла, не беспокоясь о чистоте неблокирующего IO?

5 Solutions collect form web for “Неблокирующий доступ к файлам с помощью Twisted”

Я думаю, вы ищете модуль fdesc . Для получения дополнительной информации о неблокирующем вводе-выводе в Python вы также можете посмотреть это видео .

Существует открытый билет для этого в Twisted – # 3983 .

После множества поисков, проб и ошибок, я наконец понял, как использовать fdesc .

 from __future__ import print_function from twisted.internet.task import react from twisted.internet import stdio, protocol from twisted.internet.defer import Deferred from twisted.internet.fdesc import readFromFD, setNonBlocking class FileReader(protocol.Protocol): def __init__(self, filename): self.f = open(filename, 'rb') def dataReceived(self, data): self.transport.write(data) def connectionMade(self): fd = self.f.fileno() setNonBlocking(fd) readFromFD(fd, self.dataReceived) def connectionLost(self, reason): self.f.close() def main(reactor, filename): stdio.StandardIO(FileReader(filename)) 

[Edit: Я также просто вычислил более простой способ, который не требует использования протокола]

 def getFile(filename): with open(filename) as f: d = Deferred() fd = f.fileno() setNonBlocking(fd) readFromFD(fd, d.callback) return d def main(reactor, filename): d = getFile(filename) return d.addCallback(print) 

Выполните так:

 react(main, ['/path/to/file']) 

Модуль fdesc может быть полезен для асинхронного общения с сокетом или каналом, но при задании fd, который относится к обычному файлу файловой системы, он блокирует io (и через довольно нечетный интерфейс). Для диска io fdesc является эффективным змеевым маслом; не используйте его.

По состоянию на май 2017 года, единственный разумный способ получить асинхронный диск io в скрученном состоянии – это обернуть синхронные вызовы io в deferToThread .

Я не уверен, чего вы хотите достичь. Когда вы регистрируетесь, Python будет проверять (по протоколу глобального интерпретатора), что сообщения журнала из нескольких потоков вступают в файл один за другим.

Если вы обеспокоены блокировкой ввода-вывода, то ОС добавляет буферы по умолчанию для ваших файлов (обычно 4 КБ), и вы можете передать размер буфера в вызове open() .

Если вас беспокоит что-то еще, уточните свой вопрос.

  • Объект «NoneType» не имеет атрибута «_app_data» в scrapy \ twisted \ openssl
  • Асинхронное программирование на Python Twisted
  • Twisted transport.write
  • «twistd» не является признанной внутренней или внешней командой
  • Может ли скрученный быть реализован на Java?
  • Twisted client protocol - добавление интерфейса интерфейса
  • Альтернатива замкнутой петле, которая не блокирует резьбу реактора
  • Скрученный UDP к TCP-мосту
  •  
    Interesting Posts for Van-Lav

    Python: Создание потокового gzip'd-файла?

    Фильтрация HTML-элементов, которые имеют «display: none» либо как атрибут тега, либо в их CSS

    Могут ли исполняемые файлы, созданные с помощью py2app, включать другие терминальные сценарии и запускать их?

    Создание нового файла, имя файла содержит переменную цикла, python

    python httplib Имя или услуга неизвестны

    Создание установщика Windows для Python + набора зависимостей

    Statsmodels: Рассчитать установленные значения и R-квадрат

    Как изменить единицу осей фигуры, представляющей массив (например, X пикселей на 1 километр)?

    Почему мой QGraphicsItem не может быть выбран?

    Как инициализировать базовый (супер) класс?

    как показать атрибуты экземпляра в документе sphinx?

    Нарисуйте карту определенной страны с картофелем?

    Как проверить, является ли int между двумя номерами?

    В Python Как объявить динамический массив

    python dict to numpy структурированный массив

    Python - лучший язык программирования в мире.