我在试图理解多处理和多线程时感到困惑
那么这段代码将为列表中的每个元素创建5个线程?如果列表有一百万个项目,这会创建一百万个线程吗?线程有限制吗?
如果我指定ThreadPoolExecutor(10)
,将创建多少个线程?5或10
import concurrent.futures
list = [1,2,3,4,5]
with concurrent.futures.ThreadPoolExecutor() as executor:
executor.map(function, list)
当涉及到多处理时,更令人困惑的是,例如,这段代码是否在不同的核心上运行5个进程?如果CPU只有4个核心,那么最后一个进程在哪里运行呢?
import concurrent.futures
list = [1,2,3,4,5]
with concurrent.futures.ProcessPoolExecutor() as executor:
executor.map(function, list)
我的目标是处理许多文件夹(数千个(,读取每个文件夹中的文件,并将数据写入数据库
所以这段代码将为列表中的每个元素创建5个线程?
list = [1,2,3,4,5] with concurrent.futures.ThreadPoolExecutor() as executor: executor.map(function, list)
该代码将创建一个ThreadPoolExecutor
,然后它将向执行器提交五个任务。
如果列表有一百万个项目,这会创建一百万个线程吗?
任务不是线程。任务是一些需要完成的工作。在上面的例子中,任务是";呼叫CCD_ 3"呼叫function(2)
;等等。ThreadPoolExecutor
对象将创建一些用于执行这些任务的工作线程,但工作线程的数量可能远小于它最终为您执行的任务数量。
如果我指定
ThreadPoolExecutor(10)
,将创建多少个线程?
ThreadPoolExecutor
的文档有点模糊,但我认为您可以从中推断出,在这种情况下,执行器永远不会同时运行超过十个工人。
每个工作人员一次只运行一个任务。当程序提交的任务超过执行器允许管理的最大工作线程数(即,在这种情况下超过十个任务(时,最近提交的任务将在队列中等待。工作人员一完成一项任务,就会尝试从队列中选择另一项任务并执行。如果工作人员发现队列为空,则该工作人员将变为空闲
我使用过的其他库中的线程池采用了各种关于空闲工作者的策略。有些人会解雇闲置时间过长的员工,然后在提交新任务时重新创建他们。最简单的方法是始终保持确切数量的工作线程,并允许它们在不需要的时候保持空闲。我不知道Python的ThreadPoolExecutor
。该文件没有说明它对闲置工人的处理方法。
这段代码在不同的核心上运行5个进程吗?如果CPU只有4个核心呢。。。?
Python对核心一无所知。决定如何以及何时使用主机的CPU核心是操作系统调度程序的工作即使是一个只有一个核心的主机也可以运行一个有多个线程的程序。每隔一段时间(可能每秒100次(,调度器就会被定时器中断唤醒。它考虑当时实际运行的所有线程(每个逻辑核心上最多一个线程(,并考虑准备运行(也称为"可运行"(的所有线程,它可能抢占一个正在运行的线程(即,将其从核心移回准备运行的队列(,以便另一个线程可以轮流运行。
每个CPU核心有一个线程(除非使用超线程(。将工作负载划分为多个部分,并将每个线程分配给一个部分。多处理池库在自动执行此操作方面做得很好。