Python RQ-планировщик не дает никакого выхода - PullRequest
0 голосов
/ 16 апреля 2020

Я не могу заставить работать rq_scheduler. Вот простой пример:

app.py

from flask import Flask
import datetime
from redis import Redis
from rq import Queue
from rq_scheduler import Scheduler

from tasks import example

app=Flask(__name__)
app.secret_key='abc'

app.redis = Redis.from_url('redis://')
app.task_queue = Queue('test', connection=app.redis)
scheduler = Scheduler(queue=app.task_queue,connection=app.redis)

#app.task_queue.enqueue('tasks.example',2)
#scheduler.enqueue_at(datetime.datetime(2020,4,16,10,46), example, 2) 
scheduler.enqueue_in(datetime.timedelta(seconds=1), example, 2) 

if __name__=='__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

tasks.py

import time

def example(seconds):
    print('Starting task')
    for i in range(seconds):
        print(i)
        time.sleep(1)
    print('Task completed')

В терминале приложения в терминале я запускаю следующее на отдельных вкладках :

$redis-server

$rq worker test

$rqscheduler

$python app.py

Первый queue.enqueue работает нормально. Обе задачи планировщика ничего не делают. Что не так?

1 Ответ

0 голосов
/ 16 апреля 2020

Я подозреваю, что вы можете запутаться, потому что rqscheduler по умолчанию проверяет новые задания каждую минуту. Вы можете настроить это с помощью флага -i, чтобы установить интервал в секундах, а также добавить флаг -v для более подробного вывода:

rqscheduler -i 1 -v

Однако я также заметил еще одну проблему с вышеупомянутым Flask code ...

Возможно, из-за сервера dev , порождающего отдельный процесс Я обнаружил, что функция scheduler.enqueue_in дважды ставила задачу в очередь. Это, вероятно, не было бы проблемой, если бы функция enqueue_in была вызвана внутри функции представления. Однако, где бы он ни находился, он фактически запускается при запуске приложения.

Так что при запуске с сервера dev он выполняется дважды . Затем он будет запускаться один раз каждый раз, когда автозагрузчик обнаруживает изменение кода: так что после запуска сервера dev и сохранения изменения в коде всего 3 задания были поставлены в очередь.

Для проверки этого может быть целесообразно иметь простой python скрипт, который на самом деле не запускает приложение Flask:

# enqueue_test.py

from redis import Redis
from rq import Queue
from rq_scheduler import Scheduler

from tasks import example

r = Redis.from_url('redis://localhost:6379')
q = Queue('test', connection=r)
scheduler = Scheduler(queue=q, connection=r)
scheduler.enqueue_in(datetime.timedelta(seconds=1), example, 2) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...