Odi*_*ura 5 python mongodb airflow
我正在将 .NET 应用程序重构为气流。此 .NET 应用程序使用多个线程从 mongoDB 中提取和处理数据(如果没有多个线程,该过程大约需要 10 小时,如果使用多线程,我可以减少这个时间)。
在 mongoDB 的每个文档中,我都有一个名为 的键值process。该值用于控制哪个线程处理文档。我将开发一个 Airflow DAG 来优化这个过程。我的疑问是性能和实现此目的的最佳方法。
我的应用程序应该有多个任务(我将控制processpython 方法的输入中的变量)。或者我应该只使用 1 个任务并在该任务中使用 Python 多线程?下图说明了我的疑问。
我知道使用 MultiTask 我将执行更多的数据库读取(每个任务 1 次)。虽然,使用 Python 多线程,我知道我必须在任务方法内进行大量控制处理。最好、最快、最优化的方法是什么?
这实际上取决于您的处理性质。
Python 中的多线程可能会受到 GIL(全局解释器锁)的限制 - 有些操作需要独占锁,这限制了它可以实现的并行性。特别是如果混合 CPU 和 I/O 操作,其影响可能是线程花费大量时间等待锁。但这实际上取决于你做什么——你需要进行实验,看看 GIL 是否会影响你的多线程。
多处理(Airflow 用于本地执行器)更好,因为每个进程有效地运行一个单独的 Python 解释器。因此每个进程都有自己的 GIL - 以使用资源为代价(每个进程使用自己的内存、套接字等)。Airlfow 中的每个任务都将在单独的进程中运行。
然而 Airflow 提供的功能还多一点——它还提供多机功能。您可以在 Y 台机器上使用 X 个进程运行单独的工作进程,一次有效地运行最多 X*Y 个进程。
不幸的是,Airflow(目前)不太适合运行动态数量的相同类型的并行任务。具体来说,如果您想将负载拆分为 N 个部分,并在单独的任务中运行每个部分 - 只有当 N 是恒定的并且对于同一个 DAG 不会随时间变化时,这才真正有效(例如,如果您知道您有 10 台机器) ,使用 4 个 CPU,您通常希望一次运行 10*4 = 40 个任务,因此您必须将作业拆分为 40 个任务。而且它实际上无法在运行之间动态更改 - 您必须编写 DAG每次运行时运行 40 个并行任务。
不确定我是否有帮助,但没有单一的“最佳优化”答案 - 您需要进行实验并检查什么最适合您的情况。