在我用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)。
感谢你的时间
答案 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(上面的代码基于上面的代码)