Python / rq - 如何将信息从调用者传递给worker?

问题描述 投票:2回答:1

我想使用rq在一个单独的工作人员上运行任务来从测量仪器收集数据。用户按下破折号应用程序上的按钮即可发出任务结束信号。问题是任务本身不知道何时终止,因为它无法访问破折号应用程序的上下文。

我已经使用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字典。

python flask redis plotly-dash python-rq
1个回答
2
投票

因为您没有获取更新的元数据。但是,不要这样做!!调用save_meta并在调用者和worker中刷新将丢失数据。

相反,使用job.connection.set(job + ':should_stop', 1, ex=300)设置标志,并使用job.connection.get(job + ':should_stop')检查是否设置了标志。

© www.soinside.com 2019 - 2024. All rights reserved.