Concurrency 我应该如何并行化cpu密集型和网络密集型任务的混合(芹菜)

Concurrency 我应该如何并行化cpu密集型和网络密集型任务的混合(芹菜),concurrency,parallel-processing,multiprocessing,celery,Concurrency,Parallel Processing,Multiprocessing,Celery,我的工作是扫描网络文件系统(可以是远程的),提取许多文件,对它们进行计算,并将结果(每个文件)推送到数据库中。我正在把它移到芹菜上,这样它可以被放大。文件的数量可能会变得非常巨大(1M+) 我不确定采取什么设计方法,具体如下: 统一的“结束”任务 一个任务获取一个批(N个文件的列表),提取它们,计算并上传结果 (使用批处理而不是单个文件是为了优化到远程文件系统和数据库的连接,尽管这是一种纯粹的启发式方法) 显然,一个任务将花费很大一部分时间等待I/O,因此我们需要处理大量的工作进程(远远超过#个

我的工作是扫描网络文件系统(可以是远程的),提取许多文件,对它们进行计算,并将结果(每个文件)推送到数据库中。我正在把它移到芹菜上,这样它可以被放大。文件的数量可能会变得非常巨大(1M+)

我不确定采取什么设计方法,具体如下:

统一的“结束”任务 一个任务获取一个批(N个文件的列表),提取它们,计算并上传结果

(使用批处理而不是单个文件是为了优化到远程文件系统和数据库的连接,尽管这是一种纯粹的启发式方法)

显然,一个任务将花费很大一部分时间等待I/O,因此我们需要处理大量的工作进程(远远超过#个CPU),以便我有足够的任务同时运行(计算)

pro:设计简单,编码和控制更容易。
con:可能需要在每次安装时单独调整进程池大小,因为这取决于环境(网络、机器等)

分成专门的小任务 下载、计算、上传(同样是批处理)。
直觉上,这个选项很吸引人,但实际上我看不出它的优势


我很高兴能得到一些关于并发设计的教程参考,以及设计建议。

您可以编写一个简单的python脚本,它运行在
k*cpu\u count
线程上,只需连接到远程服务器并在没有芹菜的情况下获取文件

就我个人而言,我发现在4到7之间的k值在IO绑定任务的CPU利用率方面提供了更好的结果。根据生成的文件数或要使用的速率,可以使用适当数量的线程

或者,如果任务是IO绑定的,则可以使用芹菜+gevent或芹菜与线程


对于计算和更新数据库,您可以使用芹菜,以便可以根据您的需求动态扩展。如果一次有太多的任务需要DB连接,那么应该为工作人员使用DB连接池。

而不是芹菜,您可以编写一个简单的python脚本,在
k*cpu\u count
线程上运行,只需连接到远程服务器并在没有芹菜的情况下获取文件

就我个人而言,我发现在4到7之间的k值在IO绑定任务的CPU利用率方面提供了更好的结果。根据生成的文件数或要使用的速率,可以使用适当数量的线程

或者,如果任务是IO绑定的,则可以使用芹菜+gevent或芹菜与线程


对于计算和更新数据库,您可以使用芹菜,以便可以根据您的需求动态扩展。如果一次有太多的任务需要DB连接,则应使用工作者DB连接池。

与每个文件的计算相比,扫描网络文件系统需要多长时间

远程文件系统的层次结构是什么样子的?文件是否均匀分布?你如何利用这个优势

我会遵循这样一个过程: 1.在一个进程中,列出根远程目标文件夹的前两个级别。 2.对于发现的每个文件夹,启动一个单独的芹菜流程,进一步列出这些文件夹的内容。您可能还希望保存发现的文件的位置,以防出现问题。 3.列出远程文件系统的内容和列出文件的所有芹菜进程后,可以进入处理模式。 4.您可能希望列出包含2个进程的文件,并使用其余核心开始执行每个文件的工作


注意:在使用python进行所有操作之前,我还将研究像xargs和find这样的bash工具如何在远程文件发现中协同工作。Xargs允许您启动多个C进程来执行您想要的操作。这可能是执行远程文件发现并将所有内容传递给python代码的最有效方法。

与每个文件的计算相比,扫描网络文件系统需要多长时间

远程文件系统的层次结构是什么样子的?文件是否均匀分布?你如何利用这个优势

我会遵循这样一个过程: 1.在一个进程中,列出根远程目标文件夹的前两个级别。 2.对于发现的每个文件夹,启动一个单独的芹菜流程,进一步列出这些文件夹的内容。您可能还希望保存发现的文件的位置,以防出现问题。 3.列出远程文件系统的内容和列出文件的所有芹菜进程后,可以进入处理模式。 4.您可能希望列出包含2个进程的文件,并使用其余核心开始执行每个文件的工作


注意:在使用python进行所有操作之前,我还将研究像xargs和find这样的bash工具如何在远程文件发现中协同工作。Xargs允许您启动多个C进程来执行您想要的操作。这可能是执行远程文件发现并将所有内容传递给python代码的最有效的方法。

您希望整个过程完成的持续时间是否有上限?@DivijSehgal yes。它可以谈判,但应该是合理的。比如说,几个小时。你希望整个过程完成的时间有上限吗?@DivijSehgal是的。它可以谈判,但应该是合理的。比如说,几个小时。谢谢。提前处理大量的文件是不可行的,因此这两个进程应该并行运行,这使系统在早期阶段变得复杂。你能详细解释一下为什么在I/O任务中使用芹菜不是一个好主意吗?你不需要一开始就提取所有文件。这个剧本可以吸引我