Python / rq - Как передать информацию от звонящего работнику? - PullRequest
2 голосов
/ 19 марта 2019

Я хочу использовать rq для запуска задач на отдельном работнике для сбора данных с измерительного прибора. Пользователь будет нажимать кнопку в приложении Dash о завершении задачи. Проблема заключается в том, что сама задача не знает, когда завершить свою работу, поскольку у нее нет доступа к контексту dash-приложения.

Я уже использую meta для передачи информации от работника обратно вызывающей стороне, но могу ли я передать информацию от звонящего работнику?

Пример задачи:

from rq import get_current_job
from time import time

def mock_measurement():
    job = get_current_job()
    t_start = time()

    # Run the measurement
    t = []
    i = []
    job.meta['should_stop'] = False # I want to use this tag to tell the job to stop
    while not job.meta['should_stop']:
        t.append(time() - t_start)
        i.append(np.random.random())
        job.meta['data'] = (t, i)
        job.save_meta()
        sleep(5)
    print("Job Finished")

С консоли я могу начать работу как таковую

queue = rq.Queue('test-app', connection=Redis('localhost', 6379))
job = queue.enqueue('tasks.mock_measurement')

и я хотел бы иметь возможность сделать это из консоли, чтобы указать работнику, что он может прекратить работу:

job.meta['should_stop'] = True
job.save_meta()
job.refresh

Однако, хотя приведенные выше команды возвращаются без ошибок, они фактически не обновляют словарь meta.

1 Ответ

2 голосов
/ 19 марта 2019

Потому что вы не получили обновленную мету. Но не делай этого !! Вызов save_meta и обновление в вызывающей и рабочий потеряет данные.

Вместо этого используйте job.connection.set(job + ':should_stop', 1, ex=300), чтобы установить флаг, и job.connection.get(job + ':should_stop'), чтобы проверить, установлен ли флаг.

...