Python 如何根据数字添加线程

Python 如何根据数字添加线程,python,multithreading,python-multithreading,Python,Multithreading,Python Multithreading,在我用python编写的软件代码的一部分中,我有一个项目列表,其中的项目大小可以从12项到仅一项相差很大。对于此列表中的每个项目,我都在进行一些处理(发送一个与给定项目相关的HTTP请求、解析结果和许多其他操作)。我想使用线程加速我的代码,我想创建两个线程,其中每个线程接收多个项目,并异步进行处理 示例1:假设在我的列表中有12个项目,在本例中,每个线程将获取6个项目,并调用每个项目上的处理函数 示例2:现在让我们假设我的列表有9项,一个线程包含5项,另一个线程包含其余4项 目前我没有应用任何线

在我用python编写的软件代码的一部分中,我有一个项目列表,其中的项目大小可以从12项到仅一项相差很大。对于此列表中的每个项目,我都在进行一些处理(发送一个与给定项目相关的HTTP请求、解析结果和许多其他操作)。我想使用线程加速我的代码,我想创建两个线程,其中每个线程接收多个项目,并异步进行处理

示例1:假设在我的列表中有12个项目,在本例中,每个线程将获取6个项目,并调用每个项目上的处理函数

示例2:现在让我们假设我的列表有9项,一个线程包含5项,另一个线程包含其余4项

目前我没有应用任何线程,而且我的代码库非常大,因此这里有一些代码的作用与我的案例几乎相同:

#This procedure need to be used with threading .
itemList = getItems() #This function return an unknown number of items between 1 and 12

if len(itemList) > 0: # Make sure that the list is empty in this case .
    for item in itemList:
        processItem(item) #This is an imaginary function that do the processing on each item 
下面是一个基本的lite代码,它解释了我在做什么,我不知道如何使我的线程灵活,所以每一个线程都接受一些项目,而另一个线程接受其余的项目(如示例1和2中所述)


感谢您抽出时间

您可能更愿意使用共享队列来实现它

引用 :

队列模块实现了多生产者、多消费者队列 在线程编程中,当信息必须 在多个线程之间安全地交换

这个想法是,您有一个共享存储,每个线程都会尝试从中逐个读取项目。 这比预先分配负载要灵活得多,因为您不知道操作系统将如何安排线程执行,每次迭代将花费多少时间等。 此外,您还可以动态地将进一步处理的项目添加到此队列中—例如,使生产者线程并行运行

一些有用的链接:

python并发编程简介:

关于生产者-消费者模式的更多详细信息,逐行解释:

您可能更愿意使用共享队列来实现它

引用 :

队列模块实现了多生产者、多消费者队列 在线程编程中,当信息必须 在多个线程之间安全地交换

这个想法是,您有一个共享存储,每个线程都会尝试从中逐个读取项目。 这比预先分配负载要灵活得多,因为您不知道操作系统将如何安排线程执行,每次迭代将花费多少时间等。 此外,您还可以动态地将进一步处理的项目添加到此队列中—例如,使生产者线程并行运行

一些有用的链接:

python并发编程简介:

关于生产者-消费者模式的更多详细信息,逐行解释:

您可以使用Python 3中模块中的类。Python 2中没有该模块,但有一些解决方法(我将不讨论)

线程池执行器基本上执行@ffeast建议的操作,但您需要编写的代码行较少。它管理一个线程池,该线程池将以最有效的方式执行您提交给它的所有任务。结果将通过
Future
对象返回,这些对象表示“挂起”结果

由于您似乎预先知道任务列表,因此这对您来说特别方便。虽然您无法保证任务将如何在线程之间分割,但结果可能至少与手动编写的任何代码一样好

from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=2) as executor:
    for item in getItems():
        executor.submit(processItem, item)
如果您需要关于输出的更多信息,例如识别已完成的未来或从中获得结果的某种方法,请参阅Python文档中的(上面的代码主要基于该文档)

线程池执行器基本上执行@ffeast建议的操作,但您需要编写的代码行较少。它管理一个线程池,该线程池将以最有效的方式执行您提交给它的所有任务。结果将通过
Future
对象返回,这些对象表示“挂起”结果

由于您似乎预先知道任务列表,因此这对您来说特别方便。虽然您无法保证任务将如何在线程之间分割,但结果可能至少与手动编写的任何代码一样好

from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=2) as executor:
    for item in getItems():
        executor.submit(processItem, item)

如果您需要有关输出的更多信息,例如识别已完成的未来或从中获得结果的某种方法,请参阅Python文档中的(上面的代码主要基于此)。

这正是我要提出的,但您更快了:-)。对此代码的一些解释。所有挂起的工作项都在
队列中
。工作线程不知道要处理多少项。他们一个接一个地处理项目,直到结束(
None
)。非常感谢您的输入,但我对线程非常陌生,我希望您能解释您的代码或添加一些注释,以便其他新手更好地理解。这看起来像是您重新发明了线程执行器。虽然代码很好。这正是我要提出的,但你更快了:-)。对这段代码的一些解释。所有挂起的工作项都在
队列中
。工作线程不知道要处理多少项。他们一个接一个地处理项目,直到结束(
None
)。非常感谢您的输入,但我对线程非常陌生,我希望您能解释您的代码或添加一些注释,以便其他新手更好地理解。这看起来像是您重新发明了线程e