Python / rq - 如何将来自调用者的信息传递给工作者?

5
我希望使用rq在单独的工作线程上运行任务,从测量仪器中收集数据。任务结束会由用户在dash应用程序上按下按钮来发出信号。问题是,任务本身无法确定何时终止,因为它无法访问dash应用程序的上下文。
我已经使用将信息从工作线程传递回调用者,但我能否将信息从调用者传递到工作线程?
示例任务:
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
因为您没有获取更新的元数据。但是,请不要这样做!在调用程序和工作程序中调用save_meta和refresh将丢失数据。
相反,使用job.connection.set(job + ':should_stop',1,ex = 300)设置标志,并使用job.connection.get(job + ':should_stop')检查是否已设置标志。

只是为了澄清,如果有其他人有同样的问题,我最终在调用方使用了 queue.connection.set(job.key + b':should_stop', 1, ex=30) ,在工作者方使用了 connection.get(job.key + b':should_stop')。谢谢! - Doug P.
1
@DougP。你是对的,self.connectionself.key()应该改为job.connectionjob.key - duyue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接