27 lines
983 B
Python
27 lines
983 B
Python
from typing import List
|
|
|
|
from redis.client import Pipeline
|
|
from redis.exceptions import WatchError
|
|
|
|
from .job import Job
|
|
|
|
|
|
class Dependency:
|
|
@classmethod
|
|
def get_jobs_with_met_dependencies(cls, jobs: List['Job'], pipeline: Pipeline):
|
|
jobs_with_met_dependencies = []
|
|
jobs_with_unmet_dependencies = []
|
|
for job in jobs:
|
|
while True:
|
|
try:
|
|
pipeline.watch(*[Job.key_for(dependency_id) for dependency_id in job._dependency_ids])
|
|
job.register_dependency(pipeline=pipeline)
|
|
if job.dependencies_are_met(pipeline=pipeline):
|
|
jobs_with_met_dependencies.append(job)
|
|
else:
|
|
jobs_with_unmet_dependencies.append(job)
|
|
pipeline.execute()
|
|
except WatchError:
|
|
continue
|
|
break
|
|
return jobs_with_met_dependencies, jobs_with_unmet_dependencies
|