python - 并行处理大量小任务

标签 python concurrency parallel-processing multiprocessing

我有一个要求,我必须并行处理大量(以百万计)小型 CPU 密集型任务,其中每个任务大约需要 10 秒。如果我使用多处理或多线程,我将需要大量的线程/进程实例。我该如何着手解决这个问题,以便花费最少的时间?

最佳答案

最常见的模式是横向扩展。如果您有 1,000,000 个任务 @ 10 秒/任务 = 单个 CPU 处理 10,000,000 秒或 166,667 分钟(2,778 小时或 116 天)。考虑一下如果您使用的是一台多核机器,4 个内核可以将它减少到 29 天(粗略估计可能需要一个内核来处理队列......)。 64 个核心将是 ~116 天/64 = 1.8 天。

如果单台机器性能不符合您的标准,您可以扩展到多台机器。所有主要的云服务都提供排队系统,使这变得容易/可能:

  • 亚马逊 SQS
  • RabbitMQ
  • 卡夫卡
  • NSQ
  • 等等

https://anwaarlabs.wordpress.com/2014/04/28/message-queue-part-3-jms-domains/ 的图像属性

每台机器不再局限于一台机器,而是共享一个到全局队列的连接,它们(图中的消费者)可以在其中拉取任务,从而允许您根据需要横向扩展到尽可能多的 CPU 内核。

multi node queueing system https://anwaarlabs.files.wordpress.com/2014/04/messaging-queue.png


对于 CPU 密集型任务,多线程是一个糟糕的选择,因为 GIL .如果你只有几百万个项目,使用 python 多处理和多处理队列并在一台机器上横向扩展可能会降低复杂性(即从云提供商那里租用一台 64 核机器在几分钟内处理。策略(纵向扩展单台机器与横向扩展多台机器)取决于您的工作负载大小以及性能限制和成本限制。

关于python - 并行处理大量小任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57928763/

相关文章:

c++ - OpenMP/C++ 如何并行递增一个变量?

python - 对于在 Django 中使用模型翻译翻译的字段,如何在 upload_to 方法中获取 FileField 的字段名?

python - 基于多个条件对多维数组进行排序的算法

c# struct array 的并发性

multithreading - Parallel.ForEach 已过时。老了,过时了?

python - 了解 dask 中的 map_partitions 的作用

python - FastAPI 如何修复错误遍历文件系统 : OSError [Errno 40] Too many levels of symbolic links: '/sys/class/vtconsole/vtcon0/subsystem?

python - pandas.read_csv() 可以在同一列中应用不同的日期格式!这是一个已知的错误吗?如何解决?

Java并发查询

multithreading - 术语问题: mutex lock,自旋锁,可 sleep 锁