python - 处理大量数据而无需等待 block 完成

标签 python python-3.x multiprocessing

我对 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 。我不想让代码等待,只是为了尽快获取新的模拟文件。

enter image description here

您对如何更好地编码有什么建议吗?

一些说明:

我将池减少到比 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/

相关文章:

python - 按下 'q' 后如何终止脚本?

python - 如何从另一个 Python 文件运行不在目录中的 Python 文件?

python - 制作 Tkinter Photoimage 使 python 程序崩溃

python - 如何初始化一个目标不带参数的Python多处理进程?

multiprocessing - 用 xarray/dask 替换的并行引导

python - 在python中使用PID启动进程并重用

python - python 代码片段的解释 >>numpy.nonzero(row == max(row))[0][0]<< 来自使用 numpy 的脚本

javascript - 如何使用 html2canvas 代理

python - PyCharm : No module named scipy. 稀疏中的 Gensim ImportError

python - 我如何在 python 中使用 multiprocessing.Pool.map 来处理对象中的函数?