python守护进程,不';无法写入文件

python守护进程,不';无法写入文件,python,multiprocessing,Python,Multiprocessing,我正在使用Multiprocessing.Queue在我的处理进程和守护进程之间进行通信。守护进程从队列中获取输出,并在无限循环中写入文件。文件对象在后台进程printToFile本身中打开 resultqueue = Queue() p = Process(target = printToFile , args=(resultqueue)) p.daemon = True p.start() for si, ei in ranges: pr = Process(target = p

我正在使用Multiprocessing.Queue在我的处理进程和守护进程之间进行通信。守护进程从队列中获取输出,并在无限循环中写入文件。文件对象在后台进程printToFile本身中打开

resultqueue = Queue()
p = Process(target = printToFile , args=(resultqueue))
p.daemon = True
p.start()


for si, ei in ranges:
    pr = Process(target = processing , args=(si, ei, resultqueue))
    pr.start()
    processes.append(pr)

for pr in processes:
    pr.join()
我的问题是printToFile不向文件写入任何内容,即使它将从队列中获得的输出打印到屏幕上。当我删除该行,将其设置为守护进程,并使用Ctrl+C手动终止该程序时,一切正常。有人能帮我理解发生了什么事吗。我不知道从哪里开始调试

我没有使用fileObject.close(),因为当程序完成执行时守护进程将死亡。但我不认为这是问题所在,因为当我使用Ctrl+C时,程序确实会写入文件,而没有创建进程守护进程。
另一个(可能不相关)问题是,当文件对象不是在printToFile中实例化的,而是全局对象时,即使使用Ctrl+C也不会将输出打印到文件。但我可以接受。但我还是想知道发生了什么

既然我的猜测在评论中是成功的,我会指出我所说的。 函数有第三个参数-
缓冲

可选缓冲参数指定文件所需的缓冲区 大小:0表示未缓冲,1表示缓存线,任何其他正 值表示使用(大约)该大小(以字节为单位)的缓冲区。A. 负缓冲意味着使用系统默认值,通常是 为tty设备缓冲行,为其他文件完全缓冲。如果省略,则使用系统默认值


通过将
0
作为第三个参数,您可以在无缓冲模式下打开一个文件,因此更改会立即显示在那里。

由于我的猜测在注释中成功,我将指出我所说的内容。 函数有第三个参数-
缓冲

可选缓冲参数指定文件所需的缓冲区 大小:0表示未缓冲,1表示缓存线,任何其他正 值表示使用(大约)该大小(以字节为单位)的缓冲区。A. 负缓冲意味着使用系统默认值,通常是 为tty设备缓冲行,为其他文件完全缓冲。如果省略,则使用系统默认值


通过将
0
作为第三个参数,您可以在无缓冲模式下打开文件,以便立即显示更改。

尝试使用
0
作为
open
函数的第三个参数打开文件。您能给我们一个完整的、可运行的示例吗?请参阅以获取指导。事实上,你似乎要求我们调试一个函数中的代码,但你没有向我们展示代码。谢谢@Deck,就是这样,真不敢相信我不知道。你有没有尝试在需要提供结果时调用
file.flush()
,由于问题是缓冲数据。请尝试使用
0
作为
open
函数的第三个参数打开文件。您能给我们一个完整的、可运行的示例吗?请参阅以获取指导。事实上,看起来你是在要求我们调试一个函数中的代码,但你没有向我们展示代码。谢谢@Deck,就是这样,真不敢相信我不知道。你有没有尝试在需要提供结果时调用
file.flush()
?我想这也行得通,因为问题是缓冲数据。