Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 并行计算将每个进程输出到文件_Python_Parallel Processing_Multiprocessing_Output - Fatal编程技术网

Python 并行计算将每个进程输出到文件

Python 并行计算将每个进程输出到文件,python,parallel-processing,multiprocessing,output,Python,Parallel Processing,Multiprocessing,Output,我有一个函数,我想并行计算几个值,对于每次计算,我想将输出保存到它自己的文件中 我目前正在尝试使用多处理软件包,以使其成为一个并行进程,但我对使用它还不熟悉,可能我没有正确地使用它。(我不确定池与进程类的使用)此外,我知道如何使用下面的bash命令打印输出。这实质上是一个如何实现并行计算并将结果输出到txt文件的问题 以下是我目前正在使用的玩具示例: 我将此函数保存在一个名为test.py的文件中 def fcn(n): c = int(n*(n-1)/2) print('My

我有一个函数,我想并行计算几个值,对于每次计算,我想将输出保存到它自己的文件中

我目前正在尝试使用多处理软件包,以使其成为一个并行进程,但我对使用它还不熟悉,可能我没有正确地使用它。(我不确定池与进程类的使用)此外,我知道如何使用下面的bash命令打印输出。这实质上是一个如何实现并行计算并将结果输出到txt文件的问题

以下是我目前正在使用的玩具示例: 我将此函数保存在一个名为test.py的文件中

def fcn(n):
    c = int(n*(n-1)/2)
    print('My output will print several things like this code')
    print(c)
    return
通常,当我将函数的输出写入文件时,我使用bash命令

python test.py > output.txt
对于并行计算,我的示例代码可能会将每个输出写入列表中的元素,但它不会将输出写入文件,这正是我想要的。(如果我将所有输出存储为这样的列表元素,那么我的实际问题将有很多存储在内存中。我希望它只写入一个文件并继续下一次计算)

我想要的输出是6个不同的txt文件,每个文件的输出fcn(n)为n=0,1,2,3,4,5。如果可能,我希望每个文件都以输入命名,例如0.txt、1.txt等。如有任何见解,将不胜感激

Q:…希望将输出保存到自己的文件中

为了简单起见,让我们简单一点,安全一点: 给定任务,每个正在运行的进程都是独立于其他进程的,并且都有自己的、独占的文件I/O指向“私有”、编号或以其他方式区分的文件

只需将
一起使用,即可添加一些SLOC-s。。。作为一个文件:
context-included file-I/O,最有可能的是一些
try:/except:/finally:
handling部分,用于处理在运行中发生错误的情况:

def fcn( n ):
    try:                                                               #.________
        with open( "aFileFromPROC[{0:}].txt".format( n ), "w" ) as aF: #| context
             ...do.whatever.needed...                            # aF  #|
             aF.write(...)                                       # aF  #|
             ...do.whatever.needed...                            # aF  #|
             aF.write(...)                                       # aF  #|
             ...do.whatever.needed...                            # aF  #|
             aF.write(...)                                       # aF  #|
             pass                                                # aF  #|________
    except:
        ...
    finally:
        ...
        return
请看我的回答:

这个想法是通过
多处理.Queue
创建writer-worker和管道结果。(当您希望将所有响应放在一个非平凡的文件格式(如excel)中时,需要这种想法)

另一种解决方案是写入单独的文件:

def fcn(n):
c=int(n*(n-1)/2)
打开(“文件{}.txt.”格式(n),“w”)为ff:
ff.write('我的输出将打印一些类似于此代码的内容\n')
ff.write(str(c)+'\n')
返回

您可以使用
日志记录
模块为每个进程提供一个单独的输出文件@MarkSetchell日志模块提供的输出以“WARNING:root”或“INFO:root”开头,因此可以删除吗?它与仅仅打开('filename.txt','w')并写入有什么不同?Mark的建议很聪明,它可以“收集”来自不同报告代理的输出并将其存储到一个日志中,而用户不必解决如何从多个同时运行的报告代理中重新收集详细信息的问题。如上所述,您的用例略有不同。您坚持每个进程使用一个单独的文件来分别存储“单个”结果。日志模块适用于成百上千的报告代理用许多不协调的细节充斥中心日志的情况,但日志保持整洁。总而言之,将队列添加到最简单的多处理工作流中(使用像fire and forget这样的琐碎策略)在设计和性能上都是一种过分的杀伤力(每个队列操作的成本都是双倍的-序列化/marshall/enQueue+deQueue/deserialise/yield,在对象仅以一种方式传递到一个多处理进程之前。谢谢!这两种解决方案中的任何一种都是完美的,但是,我将选择第二种,即让函数写入单独的文件,而不是使用排队传递结果。最初,我试图这样做,并将所有结果放在一个文件上,但我相信这对我来说会更容易实现,因为我对多处理软件包缺乏经验!在linux上,您可以使用
cat file1 file2 file3>out_file
轻松污染文件,谢谢!这对我也很有用!非常感谢特德!
def fcn( n ):
    try:                                                               #.________
        with open( "aFileFromPROC[{0:}].txt".format( n ), "w" ) as aF: #| context
             ...do.whatever.needed...                            # aF  #|
             aF.write(...)                                       # aF  #|
             ...do.whatever.needed...                            # aF  #|
             aF.write(...)                                       # aF  #|
             ...do.whatever.needed...                            # aF  #|
             aF.write(...)                                       # aF  #|
             pass                                                # aF  #|________
    except:
        ...
    finally:
        ...
        return