Python / rq-如何将信息从调用方传递给工作程序?

时间:2019-03-19 15:36:07

标签: python flask redis plotly-dash python-rq

我想使用rq在单独的工作程序上运行任务以从测量仪器收集数据。用户按下仪表板应用程序上的按钮将发出任务结束的信号。 问题在于任务本身不知道何时终止,因为它无法访问仪表板应用程序的上下文。

我已经使用<nav class="navbar fixed-top navbar-expand-lg navbar-dark bg-dark"> <a class="navbar-brand" href="#">Navbar</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav mr-auto"> <li class="nav-item active"> <a class="nav-link" href="#">Home <span class="sr-only">(current)</span></a> </li> <li class="nav-item"> <a class="nav-link" href="#">Link</a> </li> </ul> <form class="form-inline my-2 my-lg-0"> <input id="myInput" onkeyup="myFunction()" class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search"> </form> </div> </nav> <!-- remove the br from here, we will tackle this with the top:55px --> 将信息从工作人员传递回呼叫者,但是我可以将信息从呼叫者传递给工作人员吗?

示例任务:

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 字典。

1 个答案:

答案 0 :(得分:2)

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

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