我想使用concurrent.futures同时运行多个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)`
对于我的代码的并行版本:
def Python_callback(future):
print(future.run_type, future.jid)
return "One Folder finished executing"
def Python_execute():
from concurrent.futures import ProcessPoolExecutor as Pool
args = FileList
pool = Pool(max_workers=1)
future = pool.submit(subprocess.call, args, shell=1)
future.run_type = "run_type"
future.jid = FileList
future.add_done_callback(Python_callback)
print("Python executed")
if __name__ == '__main__':
import subprocess
Python_execute()
问题是,我不知道如何传递FileList的每个元素来分离cpu。
谢谢你提前提供帮助
发布于 2018-03-13 15:01:16
最小的更改是对每个元素使用一次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
或其他不是1
的数字,如果您有充分的理由重写默认值)。
当我们正在做这件事时,有很多方法可以简化你正在做的事情:
multiprocessing
吗?如果您需要与每个子进程进行通信,那么在单个线程中这样做可能会很痛苦--但是线程,或者可能是asyncio
,将与这里的进程一样工作。shell=1
,而不是仅仅传递一个列表而不使用shell?使用shell不必要地造成开销、安全问题和调试麻烦。jid
--它只是所有调用字符串的列表,这是没有用的。更有用的是某种标识符,或者子进程返回代码,或者…。可能还有很多其他的东西,但它们都可以通过读取subprocess.call
的返回值或简单的包装器来完成。as_completed
它,你可以打印结果,因为它们显示得更简单。pool.submit
--这意味着可以用pool.map
替换整个循环。os.walk
和glob
混合使用。当您实际有一个glob模式时,在来自fnmatch
的files
列表上应用os.walk
。但是在这里,您只需要在每个dir中寻找一个特定的文件名,所以,真正需要过滤的就是file == 'Read.py'
。i
。但是,如果您确实需要它,那么最好执行for i, file in enumerate(FileList):
,而不是执行for file in FileList:
并手动增加i
。https://stackoverflow.com/questions/49266458
复制相似问题