我对 map
感到困惑, imap
, apply_async
, apply
, Process
等来自multiprocessing
python 包。
我想做的事:
我有100 个模拟脚本文件需要通过模拟程序运行。我希望 python 能够并行运行尽可能多的脚本,然后一旦一个脚本完成,就获取一个新脚本并运行该脚本。我不想等待。
这是一个演示代码:
import multiprocessing as mp
import time
def run_sim(x):
# run
print("Running Sim: ", x)
# artificailly wait 5s
time.sleep(5)
return x
def main():
# x => my simulation files
x = list(range(100))
# run parralel process
pool = mp.Pool(mp.cpu_count()-1)
# get results
result = pool.map(run_sim, x)
print("Results: ", result)
if __name__ == "__main__":
main()
但是,我不认为 map 在这里是正确的方式,因为我希望电脑不要等待批处理完成,而是立即继续处理下一个模拟文件。
代码将运行mp.cpu_count()-1
同时进行模拟,然后等待每个模拟完成,然后再开始新一批大小 mp.cpu_count()-1
。我不想让代码等待,只是为了尽快获取新的模拟文件。
您对如何更好地编码有什么建议吗?
一些说明:
我将池减少到比 CPU 数量少 1,因为我不想阻塞 PC。 当代码运行时我仍然需要做一些轻松的工作。
最佳答案
使用 map 可以正常工作。问题很简单,你让所有线程休眠 5 秒,所以它们都会同时完成。
尝试一下这段代码,看看效果是否正确:
import multiprocessing as mp
import time
import random
def run_sim(x):
# run
t = random.randint(3,10)
print("Running Sim: ", x, " - sleep ", t)
time.sleep(t)
return x
def main():
# x => my simulation files
x = list(range(100))
# run parralel process
pool = mp.Pool(mp.cpu_count()-1)
# get results
result = pool.map(run_sim, x)
print("Results: ", result)
if __name__ == "__main__":
main()
关于python - 处理大量数据而无需等待 block 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65770862/