我想同时运行几个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
提前谢谢你的帮助
最小的变化是对每个元素使用
submit
一次,而不是对整个列表使用一次: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
和{fnmatch
应用于files
列表中的os.walk
。但是在这里,您只需要在每个dir中查找一个特定的文件名,所以实际上,您需要过滤的只是file == 'Read.py'
。在i
。但是如果您确实需要它,那么做for i, file in enumerate(FileList):
比执行for file in FileList:
并手动增加一个i
要好。在相关问题 更多 >
编程相关推荐