我想启动一个可以写入文本文件的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()
有人有建议吗?上下文是此进程最终将监听传入的数据,因此它确实需要独立于脚本中发生的其他事情而运行。
答案 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(...)
...
现在,某些操作系统不允许多个进程同时打开文件。最好的解决方案是使用队列并将数据传递到主进程,然后将其写入文件。