【问题标题】:Multiprocess reading from file多进程读取文件
【发布时间】:2017-07-29 22:49:34
【问题描述】:

我正在尝试从 2 个文件中多核读取数据,但执行此代码后 list1 和 list2 为空。

from multiprocessing import Process

def getfile(fn, out):
    print("start reading file {}".format(fn))
    with open(fn) as file:
        for line in file:
            out.append(line)

if __name__ == '__main__':
    file1 = []
    file2 = []
    p1 = Process(target=getfile, args=("100.txt", file1))
    p2 = Process(target=getfile, args=("98.txt", file2))
    p1.start()
    p2.start()

    p1.join()
    p2.join()
    print(file1)
    print(file2)

如何使用多处理将文件中的数据写入列表或可迭代的东西?

【问题讨论】:

  • 看this
  • 如果您出于性能目的尝试执行此操作,您需要注意,如果两个文件都驻留在同一个物理旋转磁盘上,同时读取这两个文件就不能使整体读取时间更快,实际上可能会使其变慢,因为磁盘磁头可能会进行额外的寻道。

标签: python multiprocessing python-multiprocessing


【解决方案1】:

当使用多个进程时,使用Queues 或Pipes 在您的父进程和您衍生的进程之间交换数据。

管道直观地允许您在父进程和子进程之间传递数据。

队列允许您的子进程在队列中存储一些数据,以便您的父进程检索它。

在您的情况下,队列最有意义,因为您的父进程似乎不需要在子进程生成后将任何数据传递给子进程。

这是一个文件的示例:

from multiprocessing import Process, Queue

def getfile(fn, out):
    with open(fn) as file:
        for line in file:
            out.put(line)

if __name__ == '__main__':
    file1 = Queue()
    p1 = Process(target=getfile, args=("100.txt", file1))
    p1.start()
    file1.get() //returns lines of the file
    p1.join()

您可以将同一个队列传递给两个进程,只需注意消息的顺序可能会在两个文件之间混合,以防您尝试分隔每个文件的内容。

【讨论】:

  • 哇!谢谢!但是如何将数据从 2 个文件中分离出来呢?
  • 创建两个队列。将不同的传递给每个进程,然后数据将被分离
  • 在这种情况下,两个进程不会单独读取整个文件吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2017-11-27
相关资源
最近更新 更多