Python同期期货使用子进程,运行几个python脚本

2024-04-28 17:58:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我想同时运行几个python脚本同期期货. 我的代码的串行版本在文件夹中查找特定的python文件并执行它。在

import re
import os
import glob
import re
from glob import glob
import concurrent.futures as cf

FileList = [];
import time
FileList = [];
start_dir = os.getcwd();
pattern   = "Read.py"

for dir,_,_ in os.walk(start_dir):
    FileList.extend(glob(os.path.join(dir,pattern))) ;

FileList

i=0
for file in FileList:
    dir=os.path.dirname((file))
    dirname1 = os.path.basename(dir) 
    print(dirname1)
    i=i+1
    Str='python '+ file
    print(Str)
    completed_process = subprocess.run(Str)`

对于并行版本的代码:

^{pr2}$

问题是,我不确定如何将文件列表的每个元素传递给单独的cpu

提前谢谢你的帮助


Tags: 文件path代码import版本reforos
5条回答

最小的变化是对每个元素使用submit一次,而不是对整个列表使用一次:

futures = []
for file in FileList:
    future = pool.submit(subprocess.call, file, shell=1)
    future.blah blah
    futures.append(future)

futures列表仅在您想对期货进行操作时才需要,等待它们完成,检查它们的返回值等

同时,使用max_workers=1显式地创建池。毫不奇怪,这意味着您将只得到一个辅助子进程,因此它将在获取下一个子进程之前等待一个子进程完成。如果您想同时运行它们,请删除max_workers,并让它默认为每个核心一个(或者传递max_workers=8或其他不是{}的数字,如果您有充分的理由覆盖默认值)。在


在我们做这件事的时候,有很多方法可以简化您的工作:

  • 你真的需要multiprocessing这里吗?如果您需要与每个子进程通信,那么在单个线程中进行通信可能会很痛苦,但是线程(或者asyncio)与这里的进程一样工作。在
  • 更重要的是,看起来您实际上并不需要任何东西,只需要启动进程并等待它完成,这可以用简单的同步代码来完成。在
  • 为什么要构建一个字符串并使用shell=1,而不是仅仅传递一个列表而不使用shell?不必要地使用shell会造成开销、安全问题和调试麻烦。在
  • 你真的不需要在每个将来都使用jid它只是你所有调用字符串的列表,这是没有用的。可能更有用的是某种标识符,或者子进程返回代码,或者……可能还有很多其他东西,但是它们都可以通过读取subprocess.call的返回值或一个简单的包装器来完成。在
  • 你真的不需要回电话。如果您只需将所有期货数据收集到一个列表中并as_completed它,则可以在结果显示得更简单时将其打印出来。在
  • 如果您同时执行上述两个操作,那么在循环中只剩下一个pool.submit,这意味着您可以用pool.map替换整个循环。在
  • 您很少需要或想要混合os.walk和{}。当您实际有一个glob模式时,将fnmatch应用于files列表中的os.walk。但是在这里,您只需要在每个dir中查找一个特定的文件名,所以实际上,您需要过滤的只是file == 'Read.py'。在
  • 您没有在循环中使用i。但是如果您确实需要它,那么做for i, file in enumerate(FileList):比执行for file in FileList:并手动增加一个i要好。在

相关问题 更多 >