gpt4 book ai didi

python - 使用多处理获取函数的标准输出

转载 作者:行者123 更新时间:2023-11-28 22:43:24 24 4
gpt4 key购买 nike

我有一个 Python 函数,它接受一个参数并将一些文本行打印到标准输出。我抓取此函数的标准输出并提取相关信息。

此函数的调用成本很高,需要几分钟才能完成。为了加快计算速度,我使用 Python 多处理并行运行此函数。现在的问题是如何区分每个worker的stdout?

跟踪每个工作人员输出到标准输出的最简单方法是什么?我可以将每个工作人员的输出重定向到某个文件描述符,然后在另一端读取每个文件描述符吗?

注意:我无法控制写入标准输出的函数。

最佳答案

假设您为每个任务使用单独的 Process(这有缺点——例如,一次运行 200 个任务通常比一次运行 8 个任务慢,尤其是当您在像 Windows 这样的平台上,进程生成有点昂贵——但可能是值得的),这并不难做到。

第一个关键是您必须替换子进程中的 sys.stdout,而不是父进程。你在哪里可以做到这一点?您可以子类化 Process 使 run 方法首先完成您的设置工作,然后调用 super 的 run,或者您可以包装每个任务的函数中的函数首先执行设置工作,然后调用真正的函数。

接下来,您可以用什么代替它?你可以让它写入一个单独的 Pipe这是父进程传入的。而且,至少在 Unix 上,只需将 sys.stdout 设置为管道的写入端就可以了。但我不确定它是否适用于 Windows。所以如果你希望它是跨平台的(因为你不会告诉我你关心什么平台,这似乎是必要的),写入文件非常简单:

例如:

tempdir = tempfile.mkdtemp()

def wrap(task, name):
def wrapper(*args, **kwargs):
with open(os.path.join(tempdir, name), 'w') as f:
sys.stdout = f
task(*args, **kwargs)
return wrapper

procs = []
for i in range(8):
name = str(i)
proc = multiprocessing.Process(target=wrap(task, name), name=name, ...)
proc.start()
procs.append(proc)
for proc in procs:
proc.join()
with open(os.path.join(tempdir, proc.name)) as f:
do_stuff_with(f.read())
shutil.rmtree(tempdir)

关于python - 使用多处理获取函数的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30793624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com