【问题标题】:What happens if two python scripts want to write in the same file?如果两个 python 脚本想写在同一个文件中会发生什么?
【发布时间】:2011-10-19 10:41:13
【问题描述】:

我有一个管道,它在某些时候将工作拆分为多个并行执行相同操作的子流程。因此它们的输出应该进入同一个文件。

说所有这些进程都应该写入同一个文件是否太冒险了?还是python看到这个资源被占用了会重试吗?

【问题讨论】:

    标签: python file io


    【解决方案1】:

    这取决于系统。在 Windows 中,资源被锁定并且您会遇到异常。在 Linux 中,您可以使用两个进程写入文件(写入的数据可以混合)

    理想情况下,您应该使用信号量来同步对共享资源的访问。

    如果使用信号量对您的需求来说过于繁重,那么唯一的选择就是写在单独的文件中......

    编辑:正如 eye 在a later post 中指出的那样,资源管理器是处理并发写入者的另一种选择

    【讨论】:

      【解决方案2】:

      一般来说,这不是一个好主意,需要非常小心才能做到正确。由于必须对写入进行序列化,因此也可能会对可伸缩性产生不利影响。

      我建议写入单独的文件并合并(或将它们保留为单独的文件)。

      【讨论】:

      • 哦,好的!它如何影响可扩展性?你的意思是如果突然很多进程想要写入同一个文件并互相阻止?
      • @dmeu:基本上就是这样。如果您有多个进程要同时写入,则只有其中一个可以,其余的将坐在那里等待而不是做有用的工作。
      【解决方案3】:

      更好的解决方案是实现资源管理器(写入器)以避免两次打开同一个文件。此管理器可以使用线程同步机制 (threading.Lock) 来避免在某些平台上同时访问。

      【讨论】:

      • 好的,我将不得不研究这个选项。这也适用于集群,对吗?在不同计算机上进行计算的系统上的含义,但共享他们写入结果的文件系统
      【解决方案4】:

      让所有不同的进程将它们的输出写入一个队列,并让一个进程读取该队列并写入文件怎么样?

      【讨论】:

        【解决方案5】:

        使用 multiprocessing.Lock() 而不是 threading.Lock()。只是一个警告!可能会减慢您的并发处理能力,因为一个进程只是等待释放锁

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-11
          • 2021-11-26
          • 1970-01-01
          • 2014-02-11
          • 2011-06-06
          • 1970-01-01
          • 2016-11-08
          • 1970-01-01
          相关资源
          最近更新 更多