如何在后台任务中访问redis连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在后台任务中访问redis连接相关的知识,希望对你有一定的参考价值。

enter image description here

我正在尝试扩展仅基于用户模型的基于烧瓶的项目https://github.com/hack4impact/flask-base/tree/master/app。我正在尝试添加使用rq在redis上运行后台任务的功能。我发现https://devcenter.heroku.com/articles/python-rq很有帮助。

这个应用程序支持redis队列,后台redis队列通过运行来实现:

@manager.command
def run_worker():
    """Initializes a slim rq task queue."""
    listen = ['default']
    conn = Redis(
        host=app.config['RQ_DEFAULT_HOST'],
        port=app.config['RQ_DEFAULT_PORT'],
        db=0,
        password=app.config['RQ_DEFAULT_PASSWORD'])

    with Connection(conn):
        worker = Worker(map(Queue, listen))
        worker.work()

使用:

$ python manage.py run_worker

在我看来,我有:

@main.route('/selected')
def background_selected():
    from rq import Queue
    from manage import run_worker.conn
    q = Queue(connection=conn)
    return q.enqueue(selected)

问题是我不知道如何将run_worker()中创建的连接导入到我的视图中。我尝试过各种变化:

from manage import run_worker.conn

但我得到了:

SyntaxError:语法无效。

如何在后台任务中访问conn变量?

答案

来自文档,python-rq Configuration

您可以尝试进行以下更改:

manager.朋友

import redis

"""Initializes a slim rq task queue."""
listen = ['default']
conn = redis.Redis(host=app.config['RQ_DEFAULT_HOST'], 
                   port=app.config['RQ_DEFAULT_PORT'],
                   db=0,     
                   password=app.config['RQ_DEFAULT_PASSWORD'])

@manager.command
def run_worker():
    with Connection(conn):
        worker = Worker(map(Queue, listen))
        worker.work()

并从视图:

from rq import Queue
from manage import conn

q = Queue(connection=conn)
另一答案

我联系了提供以下内容的开发人员:

enter image description here

以上是关于如何在后台任务中访问redis连接的主要内容,如果未能解决你的问题,请参考以下文章

Celery 为每个任务创建一个新连接

异步任务片段背景数据

微服务连接不上redis会直接访问数据库吗

redis无法远程解决办法

Serverless 解惑——函数计算如何访问 Redis 数据库

redis压测两小时后超时