Python: запись в глобальный текстовый файл из мультипроцессинга. Процесс - PullRequest
0 голосов
/ 05 июля 2018

Я хотел бы запустить процесс mp.Pro, который может записывать в текстовый файл. Но я обнаружил, что в конце скрипта данные, записанные в файл, на самом деле не сохраняются на диск. Я не знаю, что происходит. Вот минимальный рабочий пример:

import os, time, multiprocessing

myfile = open("test.dat", "w")

def main():

    proc = multiprocessing.Process(target=writer)
    proc.start()

    time.sleep(1)
    print "Times up! Closing file..."
    myfile.flush()
    os.fsync(myfile.fileno())
    print "Closing %s" % (myfile)
    myfile.close()
    print "File closed. Have a nice day!"
    print "> cat test.dat"

def writer():
    data = "0000"
    for _ in xrange(5):
        print "Writing %s to %s" % (data, myfile)
        myfile.write(str(data) + '\n')
        # if you comment me, writing to disk works!
        # myfile.flush()
        # os.fsync(myfile.fileno())

if __name__ == "__main__":
    main()

У кого-нибудь есть предложения? Контекст заключается в том, что этот Процесс в конечном итоге будет прослушивать поступающие данные, поэтому он действительно должен выполняться независимо от других событий, происходящих в сценарии.

1 Ответ

0 голосов
/ 05 июля 2018

Проблема в том, что вы открываете файл в основном процессе. Открытые файлы не передаются подпроцессам, поэтому вам нужно открыть их внутри вашей функции.

Также каждый код вне функции выполняется один раз для каждого процесса, поэтому вы перезаписываете файл несколько раз.

def main():
    # create the file empty so it can be appended to
    open("test.dat", "w").close()
    proc = multiprocessing.Process(target=writer)
    proc.start()

def writer():
    with open('test.dat', 'a') as myfile: # opens the file for appending
        ...
        myfile.write(...)
        ...

Теперь некоторые ОС не позволяют открывать файл нескольким процессам одновременно. Лучшее решение - использовать Очередь и передать данные основному процессу, который затем записывает в файл.

...