Многопроцессорность: передать дескриптор файла в 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 Multiprocessing Numpy Random
  • Python Многопроцессорный процесс или пул для того, что я делаю?
  • Авария OpenCV на OS X при чтении USB-камеры в отдельном процессе
  • многопроцессор python vs threading для работы cpu для работы с окнами и linux
  • Многопроцессорность Python, передающая ссылку на объект, содержит семафор
  • Ошибка многопроцессорности Python в Mac OS X
  • python top N количество слов, почему многопроцессор медленнее, чем один процесс
  • Максимальный предел максимальной длины очереди - 32767
  • Почему связь через разделяемую память происходит намного медленнее, чем через очереди?
  • Пример многопроцессорности Python не работает
  • Связь процесса в Python
  • Python - лучший язык программирования в мире.