Вариант 1 - Комплексный
Поскольку у вас есть последовательные задания, вы можете собрать эти задания в цепочку и позволить самим заданиям повторно отправлять их в пул потоков после их завершения. Предположим, у нас есть список рабочих мест:
[Task1, ..., Task6]
как в вашем примере. У нас есть последовательная зависимость, так что [Task3, Task4, Task6]
является цепочкой зависимостей. Теперь мы делаем работу (псевдокод Erlang):
Task4Job = fun() ->
Task4(), % Exec the Task4 job
push_job(Task6Job)
end.
Task3Job = fun() ->
Task3(), % Execute the Task3 Job
push_job(Task4Job)
end.
push_job(Task3Job).
То есть мы изменяем задание Task3
, превращая его в задание, которое в качестве продолжения переносит следующее задание в очереди в пул потоков. Существуют сильные сходства с общим стилем передачи продолжения , который также наблюдается в таких системах, как Node.js
или Pythons Twisted
framework.
Обобщая, вы создаете систему, в которой вы можете определить цепочки заданий, которые могут defer
продолжить работу и повторно передать дальнейшую работу.
Вариант 2 - Простой
Почему мы вообще пытаемся разделить работу? Я имею в виду, поскольку они зависят друг от друга, выполнение всех из них в одном и том же потоке не будет быстрее или медленнее, чем выполнение этой цепочки и ее распределение по нескольким потокам. Предполагая «достаточную» рабочую нагрузку, любой поток всегда будет работать в любом случае, так что объединить задания вместе, вероятно, проще всего:
Task = fun() ->
Task3(),
Task4(),
Task6() % Just build a new job, executing them in the order desired
end,
push_job(Task).
Довольно просто делать такие вещи, если у вас есть функции от имени граждан первого класса, поэтому вы можете строить их на своем языке по своему усмотрению, как, например, в любом функциональном языке программирования, Python, Ruby-блоках - и так далее.
Мне не особо нравится идея построения очереди или стека продолжения, как в «Варианте 1», хотя я бы определенно выбрал второй вариант. В Erlang у нас даже есть программы под названием jobs
, написанные Erlang Solutions и выпущенные как Open Source. jobs
создан для выполнения и загрузки, например, для выполнения заданий. Вероятно, я бы совместил вариант 2 с заданиями, если бы решил эту проблему.