2013-12-09 104 views
0

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

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也不会将输出打印到文件。但我可以忍受这一点。但我仍然想知道发生了什么。

+1

试着用'0'打开文件作为'open'功能的第三个参数 – Deck

+0

你能给我们一个完整的,可运行的例子吗?请参阅[SSCCE](http://sscce.org)获取指导。事实上,它看起来像是要求我们在一个你没有向我们展示代码的函数中调试代码。 – abarnert

+0

谢谢@Deck,就是这样,不敢相信我对此不知道。 – rohanag

回答

3

由于我的猜测在评论中取得了成功,我会指出我所说的。 open()函数的第三个参数 - buffering

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

作为第三个参数传递0作为第三个参数,您在非缓冲模式下打开文件,所以更改立即出现在那里。