我有数千个 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)
根据您发布的代码,我不知道每次调用 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)