Python:从multiprocessing.Process内部写入全局文本文件

时间:2018-07-05 20:43:35

标签: python io multiprocessing

我想启动一个可以写入文本文件的mp.Process。但是我发现在脚本末尾,写入文件的数据实际上并未保存到磁盘。我不知道发生了什么这是一个最小的工作示例:

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 :(得分:0)

问题在于您正在主进程中打开文件。打开的文件不会传递给子流程,因此您需要在函数内部打开它。

该函数外的每个代码也为每个进程执行一次,因此您将多次覆盖该文件。

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(...)
        ...

现在,某些操作系统不允许多个进程同时打开文件。最好的解决方案是使用队列并将数据传递到主进程,然后将其写入文件。