Python多处理循环

Python多处理循环,python,multithreading,multiprocessing,data-processing,data-ingestion,Python,Multithreading,Multiprocessing,Data Processing,Data Ingestion,我希望使用多处理来加速缓慢的循环。然而,从我所看到的多处理示例来看,我不确定这种实现是好的实践,是可行的还是可能的 该循环大致分为两个部分:数据摄取和数据处理。我希望在处理过程中开始数据摄取的下一部分,以便尽快获得数据 伪代码: d = get_data(n) for n in range(N): p = process_data(d) d = get_data(n+1) #prepare data for next process loop 多处理是否适合这种功能? 你会怎么

我希望使用多处理来加速缓慢的循环。然而,从我所看到的多处理示例来看,我不确定这种实现是好的实践,是可行的还是可能的

该循环大致分为两个部分:数据摄取和数据处理。我希望在处理过程中开始数据摄取的下一部分,以便尽快获得数据

伪代码:

d = get_data(n)
for n in range(N):
    p = process_data(d)
    d = get_data(n+1) #prepare data for next process loop
多处理是否适合这种功能? 你会怎么做?
提前感谢。

正如您所说,多处理基本上就是分派和收集工作。 正如您所阐明的,您基本上希望处理_数据并使_数据并行工作

这是我给你的解决方案

import multiprocessing as mp

# create pool for dispatching work
pool = mp.Pool()

# call your functions asynchronously
process_data_process = pool.apply_async(process_data, (d,))
get_data_process = pool.apply_async(get_data, (n+1,))

# After your functions are dispatched, wait for results
process_data_result = process_data_process.get()
get_data_result = get_data_process.get()

# Note: get_data_result will not be fetched till process_data_result is ready
# But that should be fine since you can't start the next batch
# till this batch is done
你可以把它包在你的循环里。
希望这能回答你的问题

假设您希望有一个线程/进程接收数据,因为它是I/O,而不是CPU绑定的。在将数据传递到处理层之前,您只需要对数据进行最小的解析和/或验证

让我们进一步假设您可以完全并行地对每个输入项进行数据处理;这些输入项之间没有排序或时间/顺序依赖关系

在这种情况下,您的任务基本上是扇出处理模型的海报子对象。创建一个对象。然后,创建一个。然后,该初始化代码成为摄取处理任务,队列的生产者和进程池都成为消费者,执行处理

网上有很多这样的例子,第一个链接可能有几个使用这种模式的链接

当然,剩下的问题是如何处理结果

如果它们需要序列化回某个文件,那么显而易见的方法是创建两个队列对象。。。一个用于工作队列摄取进程,一个用于池进程,另一个用于输出队列池,另一个用于工作队列摄取进程,一个用于将结果一致地写入输出。请注意,让主摄取进程多路复用是可能的,有时也是相当有效的。它可以将输入数据读取与输出队列上的轮询交错,以写出结果。但是,当然,您也可以启动另一个用于输出处理的进程

另一方面,您的结果可能可以并行编写,可能是由工作进程编写的。如果您正在将结果写入许多文件,或者将它们作为INSERT或UPDATE语句发布到某些SQL数据库,或者将它们输出到Hadoop HDFS或Spark DataSet,那么这是很好的。有许多形式的输出适合并行写入

您还可能希望解耦处理层和输出/结果处理层。您的应用程序可能会在数据处理层中使用更多的进程,而在输出层中使用更少的进程,从而得到最佳的调优。例如,如果每个项目上的处理都是CPU密集型的,并且您有许多内核,那么当CPU处于空闲状态时,您可能会遇到过多进程阻塞I/O通道的问题


同样,使用队列。它们旨在支持多生产者和多消费者的一致性。您不再需要担心并发锁定、死锁和活锁等问题。

有什么原因不能将获取和处理数据合并到一个单元中,并并行执行单元操作吗?处理过程是因果关系,取决于以前的进程。因此本质上,您想运行进程\u datad并并行获得\u datan+1吗?我相信这是对的,进程的CPU有限吗?如果没有,那么您可能最好使用多线程,因为它更容易使用。多线程和多处理都可以使用队列,让您可以轻松地通过多个函数传递数据。完美答案-谢谢!另一个有趣的问题是,“处理数据”是否从池中受益,因为它无论如何都必须等待?@Darius我想你是对的,你可以启动一个异步进程,然后同步运行另一个进程。然后,当您完成时,您可以等待异步过程完成。