以下是我的多处理代码。 regressTuple 有大约 2000 个项目。因此,以下代码创建了大约 2000 个并行进程。运行时我的 Dell xps 15 笔记本电脑崩溃了。
- python 多处理库不能根据硬件可用性处理队列并在最短时间内运行程序而不会崩溃吗?我这样做不正确吗?
- 是否有 python 中的 API 调用来获取可能的硬件进程计数?
- 我如何重构代码以使用输入变量来获取并行线程计数(硬编码)并循环多次线程直到完成 - 这样,经过几次实验,我将能够获得最佳线程数。
- 在最短时间内运行此代码而不崩溃的最佳方法是什么。 (我不能在我的实现中使用多线程)
在此我的代码:
regressTuple = [(x,) for x in regressList]
processes = []
for i in range(len(regressList)):
processes.append(Process(target=runRegressWriteStatus,args=regressTuple[i]))
for process in processes:
process.start()
for process in processes:
process.join()
最佳答案
我们需要记住很多事情
旋转进程的数量不受系统内核数量的限制,而是系统上用户 ID 的
ulimit
控制用户启动的进程总数编号。内核的数量决定了这些启动的进程中有多少实际上可以同时并行运行。
系统崩溃可能是因为这些进程正在运行的目标函数正在执行繁重且资源密集的任务,当多个进程同时运行时系统无法处理或
nprocs
系统限制已经耗尽,现在内核无法启动新的系统进程。
话虽这么说,生成多达 2000 个进程并不是一个好主意,即使你有一个 16 核 Intel Skylake 机器,因为在系统上创建一个新进程不是一个轻量级的任务,因为有诸如生成 pid、分配内存、地址空间生成、调度进程、上下文切换和管理它的整个生命周期等在后台发生的事情的数量。所以内核生成新进程是一个繁重的操作,
不幸的是,我猜你正在尝试做的是一个 CPU 绑定(bind)任务,因此受到你机器上硬件的限制。在系统上旋转的进程数量多于内核数量根本没有帮助,但创建进程池可能会有所帮助。所以基本上你想创建一个池,其中的进程数与系统上的内核数一样多,然后将输入传递给池。像这样
def target_func(data):
# process the input data
with multiprocessing.pool(processes=multiprocessing.cpu_count()) as po:
res = po.map(f, regressionTuple)
关于Python 多处理 : dealing with 2000 processes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55161760/