我有一个要求,我必须并行处理大量(以百万计)小型 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 内核。
https://anwaarlabs.files.wordpress.com/2014/04/messaging-queue.png
对于 CPU 密集型任务,多线程是一个糟糕的选择,因为 GIL .如果你只有几百万个项目,使用 python 多处理和多处理队列并在一台机器上横向扩展可能会降低复杂性(即从云提供商那里租用一台 64 核机器在几分钟内处理。策略(纵向扩展单台机器与横向扩展多台机器)取决于您的工作负载大小以及性能限制和成本限制。
关于python - 并行处理大量小任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57928763/