代码之家  ›  专栏  ›  技术社区  ›  Chris B.

Python中有没有一种简单的方法来创建一个文件,该文件可以在一个线程中写入,在另一个线程中读取?

  •  2
  • Chris B.  · 技术社区  · 16 年前

    在我正在编写的python程序中,我有一个线程,它迭代内存中的一个大型结构,并将其增量写入一个类似文件的对象中。我有另一个线程,它获取一个类似文件的对象并将其写入磁盘。有没有一种简单的方法来连接这两个线程,这样从第一个线程输入的任何数据都会被缓冲到第二个线程?

    具体来说,我正在尝试将数据传递给subprocess.Popen()。进程将从stdin中读取,但您不能将“类似文件”的对象传递给Popen,因为它调用stdin.fileno(),除非您有一个真正的文件,否则它将崩溃。

    相反,您需要将管道参数传递给Popen,这允许您将proc.stdin用作类似文件的对象。但是,如果您已经有了一个类似文件的对象,那么似乎没有一个很好的方法可以将它们结合在一起。

    4 回复  |  直到 16 年前
        1
  •  4
  •   Martin v. Löwis    16 年前

    你应该使用 Queue

        2
  •  2
  •   nosklo    16 年前

    使用 shutil 's copyfileobj() 功能:

    import shutil
    import subprocess
    
    proc = subprocess.Popen([...], stdin=subprocess.PIPE)
    
    my_input = get_filelike_object('from a place not given in the question')
    
    shutil.copyfileobj(my_input, proc.stdin)
    

        3
  •  1
  •   Martin v. Löwis    16 年前

    我认为,如果您已经有一个类似文件的对象,并且希望数据最终进入子流程,那么设计中就有问题。然后,您应该首先安排将它们写入子流程,而不是像first这样将它们写入其他文件。无论是谁编写数据,都应该允许灵活地指定输出流,这应该是子流程管道。

        4
  •  0
  •   Charlie Martin    16 年前

    我不清楚你想干什么,呃。这听起来像是一个普通旧管道的作业,它是一个类似文件的对象。然而,我猜,你的意思是你有一个其他类型的流。

    Queue tempfile .