Если вы хотите дать возможность внешним библиотекам, вы можете элегантно выразить задачи и их зависимости с помощью Ray .Это хорошо работает на одной машине, преимущество в том, что параллелизм и зависимости легче выразить с помощью Ray, чем с многопроцессорной обработкой python, и у него нет проблемы GIL (глобальной блокировки интерпретатора), которая часто мешает эффективной работе многопоточности.Кроме того, в будущем очень легко масштабировать рабочую нагрузку на кластер.
Решение выглядит следующим образом:
import ray
ray.init()
@ray.remote
def task1():
pass
@ray.remote
def task2():
pass
@ray.remote
def task3():
pass
@ray.remote
def dependent1(x1, x2, x3):
pass
@ray.remote
def task4():
pass
@ray.remote
def task5():
pass
@ray.remote
def task6():
pass
@ray.remote
def dependent2(x1, x2, x3):
pass
@ray.remote
def dependent3(x, y):
pass
id1 = task1.remote()
id2 = task2.remote()
id3 = task3.remote()
dependent_id1 = dependent1.remote(id1, id2, id3)
id4 = task4.remote()
id5 = task5.remote()
id6 = task6.remote()
dependent_id2 = dependent2.remote(id4, id5, id6)
dependent_id3 = dependent3.remote(dependent_id1, dependent_id2)
ray.get(dependent_id3) # This is optional, you can get the results if the tasks return an object
Вы также можете передавать фактические объекты Pythonмежду задачами, используя аргументы внутри задач и возвращая результаты (например, говоря «возвращаемое значение» вместо «прохода» выше).
Используя «pip install ray», приведенный выше код работает изна одном компьютере, и также легко распараллеливать приложения в кластере, либо в облаке, либо в вашем собственном кластере, см. https://ray.readthedocs.io/en/latest/autoscaling.html и https://ray.readthedocs.io/en/latest/using-ray-on-a-cluster.html).. Это может пригодиться, еслирабочая нагрузка растет позже.
Отказ от ответственности: я один из разработчиков Ray.