Очередь Redis: Как предотвратить асинхронный запуск цепочечных заданий - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь заставить 3 задания работать друг за другом в последовательности:

Job1 -> Job2 -> Job3

Эти 3 задания определены в operations.py:

def Job1(x):
    return x

def Job2(x):
    return x * x

def Job3(x):
    print(x)

I 'я вызываю эти задания в script.py при rq worker:

from redis import Redis
from rq import Queue
from operation import Job1, Job2, Job3

redis_conn = Redis()
q = Queue(connection=redis_conn)

for num in [1,2,3,4,5,6,7,8]:
    j1 = q.enqueue(Job1, num)
    j2 = q.enqueue(Job2, j1.result, depends_on = j1)
    j3 = q.enqueue(Job3, depends_on = j2)

Согласно документации 1014 *, я ожидаю, что j3 будет ждать j2, который, в свою очередь, должен ждать, пока j1закончить исполнение.Но, вероятно, этого не происходит.Задания, похоже, работают асинхронно.Я так говорю, потому что работник redis выдает это как ошибку:

File "./operation.py", line 5, in Job2
    return x * x
TypeError: unsupported operand type(s) for *: 'NoneType' and 'NoneType'

j2 вместо ожидания результата j1 также запускается асинхронно и, поскольку к тому времени результат j1 не готов, j1.result равен None, чтоперешел на J2.Что не так с моим подходом?Почему задания не выполняются последовательно?

...