【问题标题】:python multiprocessing, import txt filespython多处理,导入txt文件
【发布时间】:2018-10-16 10:23:22
【问题描述】:

我正在处理 Python 多处理,我想了解是否可以节省时间。

我有三个应该由 Python 读取的 txt 文件。所以我定义了一个打开一个txt文件并逐行读取的函数。这个函数需要的输入就是txt文件的名字:

import multiprocessing as mp
output=mp.Queue()
def funct_imp(name):
     [...]
     output.put([var1,var2,var3])
     return (var1,var2,var3)

然后我对比了第一个脚本:

res01=funct_imp(name01)
res02=funct_imp(name02)
res03=funct_imp(name03)

第二个我使用 Python 多处理:

for name in [name01,name02,name03]:
    pool=mp.Process(target=func_imp,args=name)
    pool.start()
    res=output.get()

现在我有两个主要问题:

  1. 如何获得所有流程的结果?最后我在res 中找到与res03 相同的结果
  2. 第一个脚本在 18 秒内运行,而第二个脚本在 25 秒内运行。我预计会适得其反(实际上我预计会更多地减少时间)。

【问题讨论】:

  • 我认为您需要查看多处理文档:Python Multiprocessing。使用多处理池的示例应该很容易适应您的工作
  • 如果任务本身不够耗时,那么使用多处理会使整个处理时间变得更糟,因为创建了进程,然后进程间通信的时间成本很高。因此,可以说每个进程需要 1 秒才能创建。如果您为执行需要 0.1 秒的任务创建流程,多处理的总执行时间将为 1.1 秒,而不是直接执行任务可能需要的 0.1 秒。 Ofc,只是一个例子。另外..您的代码可能会更好,我会正确回答:)

标签: python python-multiprocessing


【解决方案1】:
import multiprocessing as mp

def read_file(name):
   lines = []
   with open(name) as fp:
       lines = fp.readlines()
   return lines

if __name__ == '__main__':
    names = ['file1.txt', 'file2.txt']  # list of filenames
    pool = mp.Pool()
    results = pool.map(read_file, names)

这会将所有行读入内存,使用 pool.imap 以获得更惰性的版本,并在 read_file 中产生行。
results 将是行列表的列表。

【讨论】:

    【解决方案2】:

    尝试改用多处理池:

    from multiprocessing import Pool
    
    def f(x):
        -- process the file here --
    
    if __name__ == '__main__':
        p = Pool()
        print(p.map(f, [name01, name02, name03]))
    

    来源:https://docs.python.org/2/library/multiprocessing.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      相关资源
      最近更新 更多