Многопроцессорность: передать дескриптор файла в Process

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

Ниже приведена упрощенная версия моего кода, которая должна иллюстрировать мою проблему. Если я комментирую инструкцию flush в классе Writer , test.out пуст в конце программы.

Что именно здесь происходит? Является ли test.out не закрытым должным образом? Было ли наивно предполагать, что передача дескриптора файла в автономный процесс должна работать в первую очередь?

 from multiprocessing import JoinableQueue, Process def main(): queue = JoinableQueue() queue.put("hello world!") with open("test.out", "w") as outhandle: wproc = Writer(queue, outhandle) wproc.start() queue.join() with open("test.out") as handle: for line in handle: print(line.strip()) class Writer(Process): def __init__(self, queue, handle): Process.__init__(self) self.daemon = True self.queue = queue self.handle = handle def run(self): while True: msg = self.queue.get() print(msg, file=self.handle) #self.handle.flush() self.queue.task_done() if __name__ == '__main__': main() 

One Solution collect form web for “Многопроцессорность: передать дескриптор файла в Process”

Писатель – отдельный процесс. Данные, которые он записывает в файл, могут быть буферизованы, и поскольку процесс продолжает работать, он не знает, что он должен очистить буфер (записать его в файл). Правильно делать промывку вручную.

Обычно файл будет закрыт, когда вы выйдете из блока with, и это приведет к сбросу буфера. Но родительский процесс ничего не знает о своих дочерних буферах, поэтому ребенку нужно сбросить собственный буфер (закрытие файла должно работать тоже – это не закрывает файл для родителя, по крайней мере, в Unix-системах).

Кроме того, проверьте класс пула от многопроцессорности ( https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool ) – он может сэкономить вам некоторую работу.

  • многопроцессор python vs threading для работы cpu для работы с окнами и linux
  • Неэффективная многопроцессорность вычислений на основе numpy
  • Чистый способ получить почти-LIFO поведение от многопроцессорности. Queue? (или даже просто * не * рядом с FIFO)
  • Многопроцессорность Python выходит элегантно Как?
  • многопроцессорная очередь python: ставит независимость от получения?
  • Многопроцессорная очередь Python
  • Python Multiprocessing.Pool ленивая итерация
  • Получить код завершения процессов, запущенных с помощью многопроцессорной обработки. Pool.map
  •  
    Interesting Posts for Van-Lav

    Как установить внешние библиотеки с помощью Portable Python?

    выяснение дополнительного / противоположного цвета заданного цвета

    Комбинированный веб-сайт Selenium

    TensorFlow: DNNRegressor, как сохранить модель для прогнозирования

    Шифрование паролей на POST Django

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

    Собственные векторы, вычисляемые с помощью numpy's eigh и svd, не совпадают

    Большинство полезных модулей Python из стандартной библиотеки?

    Каков самый питоновский способ предоставить значение возврата в задании?

    Прочитать пароль от stdin

    Как я могу подтвердить свой собственный сертификат при использовании easywebdav?

    Как создать кнопку для каждого элемента в списке и поместить его в область прокрутки?

    как проверить, является ли файл каталогом или обычным файлом в python?

    Почему не работает pyplot.show ()?

    Ошибка: нет модуля с именем psycopg2.extensions

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