如何根据数字添加线程

时间:2016-08-22 19:52:32

标签: python multithreading python-multithreading

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

示例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 

下面是一个基本的精简版代码,解释了我在做什么,我无法弄清楚如何使我的线程灵活,所以每个人都需要一些项目而另一个需要其余的(如示例中所述) 1& 2)。

感谢你的时间

2 个答案:

答案 0 :(得分:2)

您可能更愿意使用共享队列来实现它 https://docs.python.org/3/library/queue.html#queue-objects

Option Explicit

Dim WorkArray(1 to GEMclass.NumofP, 1 To 4)

Sub PartTwo()
    'Your code
End Sub

Sub PartThree()
    'Your code
End Sub

引自 https://docs.python.org/3/library/queue.html#module-queue

  

队列模块实现多生产者,多消费者队列。它   当信息必须时,在线程编程中特别有用   在多个线程之间安全地交换。

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

一些有用的链接:

python中并发编程的简要介绍: http://www.slideshare.net/dabeaz/an-introduction-to-python-concurrency

有关生产者 - 消费者模式的更多详细信息,包括逐行说明: http://www.informit.com/articles/article.aspx?p=1850445&seqNum=8

答案 1 :(得分:1)

您可以使用Python 3中ThreadPoolExecutor模块中的concurrent.futures类。该模块在Python 2中不存在,但有一些解决方法(我不会讨论)。

线程池执行程序基本上完成了@ffeast提出的操作,但是您编写的代码行较少。它管理一个线程池,它将执行您提交给它的所有任务,可能是以最有效的方式。结果将通过fn splitToVector(value: usize) -> Vec<u8> { println!("Value of the usize: {}", value); let length = mem::size_of_val(&value); println!("Usize coded on {} bytes", length); let mut splitted_value: Vec<u8> = Vec::with_capacity(length); for x in 1..length + 1 { let bitPack: u8 = value.rotate_left(8 * x as u32) as u8; println!("Content of the bitPack number {}: {}", x, bitPack); splitted_value.push(bitPack); } return splitted_value; } fn main { let coucou_size: usize = "Coucou".len(); let coucou_size_bytes = splitToVector(coucou_size); assert_eq!(coucou_size_bytes.capacity(), mem::size_of_val(&coucou_size)); assert_eq!(String::from_utf8(coucou_size_bytes).unwrap().as_bytes(), coucou_size.to_string().as_bytes()); } 个对象返回,这些对象代表“待处理”结果。

由于您似乎预先了解了任务列表,因此这对您来说特别方便。虽然你不能保证在线程之间如何分割任务,但结果可能至少与你手工编码的任何东西一样好。

Future

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