如何使用Python多处理和子进程在不同文件上并行运行Pytype?

问题描述 投票:0回答:1

我有数千个 Python 文件要运行 PyType,这需要几个月的时间。因此,我尝试使用Python多处理来创建多个进程,并使用每个进程在单独的文件上运行PyType以加快运行速度。

我尝试了以下脚本,我预计会有 N 个进程,每个进程在一个不同的文件上运行 PyType。但是,我发现所有进程都在同一个文件而不是不同的文件上运行 PyType。

我怀疑是PyType内部工作机制的问题,但是,有人遇到过类似的问题吗?

import multiprocessing
import subprocess
import os

def work(cmd):
    result = subprocess.run(cmd, capture_output=True, text=True)
    return f"{os.getpid()} - Command: {cmd}\nOutput: {result.stdout}\nError: {result.stderr}"


if __name__ == '__main__':
    my_dir = "xxx"
    cmds = []
    for file in os.listdir(my_dir):
        if file.endswith(".py"):
            cmds.append(["pytype", "-o", os.path.join(my_dir, '.pytype'), os.path.join(my_dir, file)])
    count = multiprocessing.cpu_count()
    with multiprocessing.Pool(processes=count) as pool:
        results = pool.map(work, cmds)
    for result in results:
        print(result)
python multiprocessing subprocess pytype
1个回答
0
投票

根据您发布的代码,我不知道每次调用 pytype 命令将如何针对同一个 .py 文件执行。出于调试目的,我建议您修改工作函数

work
以仅返回传递给它的 python 文件名,如以下代码所示。我还建议您使用多线程池而不是多处理池。创建其唯一处理包括执行
subprocess
命令的进程是没有意义的,这会创建另一个进程。我还将使用
imap
方法来延迟创建所需的所有命令并打印结果,而无需创建
cmds
results
列表。

from multiprocessing.pool import ThreadPool
from threading import get_ident
import subprocess
import os

def work(cmd):
    # Just return the .py file name for debugging purposes.
    # Delete the following line for actual processing:  
    return cmd[-1]
    
    result = subprocess.run(cmd, capture_output=True, text=True)
    return f"{get_ident()} - Command: {cmd}\nOutput: {result.stdout}\nError: {result.stderr}"

if __name__ == '__main__':
    my_dir = "xxx"
    output_dir = os.path.join(my_dir, '.pytype')
    cmds = (
        ["pytype", "-o", output_dir, os.path.join(my_dir, file)]
        for file in os.listdir(my_dir) if file.endswith(".py")
    )

    n_processors = os.cpu_count()
    with ThreadPool(processes=n_processors) as pool:
        for result in pool.imap(work, cmds):
            print(result)
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.