【发布时间】:2011-10-19 10:41:13
【问题描述】:
我有一个管道,它在某些时候将工作拆分为多个并行执行相同操作的子流程。因此它们的输出应该进入同一个文件。
说所有这些进程都应该写入同一个文件是否太冒险了?还是python看到这个资源被占用了会重试吗?
【问题讨论】:
我有一个管道,它在某些时候将工作拆分为多个并行执行相同操作的子流程。因此它们的输出应该进入同一个文件。
说所有这些进程都应该写入同一个文件是否太冒险了?还是python看到这个资源被占用了会重试吗?
【问题讨论】:
这取决于系统。在 Windows 中,资源被锁定并且您会遇到异常。在 Linux 中,您可以使用两个进程写入文件(写入的数据可以混合)
理想情况下,您应该使用信号量来同步对共享资源的访问。
如果使用信号量对您的需求来说过于繁重,那么唯一的选择就是写在单独的文件中......
编辑:正如 eye 在a later post 中指出的那样,资源管理器是处理并发写入者的另一种选择
【讨论】:
一般来说,这不是一个好主意,需要非常小心才能做到正确。由于必须对写入进行序列化,因此也可能会对可伸缩性产生不利影响。
我建议写入单独的文件并合并(或将它们保留为单独的文件)。
【讨论】:
更好的解决方案是实现资源管理器(写入器)以避免两次打开同一个文件。此管理器可以使用线程同步机制 (threading.Lock) 来避免在某些平台上同时访问。
【讨论】:
让所有不同的进程将它们的输出写入一个队列,并让一个进程读取该队列并写入文件怎么样?
【讨论】:
使用 multiprocessing.Lock() 而不是 threading.Lock()。只是一个警告!可能会减慢您的并发处理能力,因为一个进程只是等待释放锁
【讨论】: