Запланируйте задание redis, которое планирует другое задание redis, с помощью python-rq

1

У меня есть два вида заданий: те, которые я хочу запускать в последовательном порядке, и те, которые я хочу запускать параллельно параллельно. Однако я хочу, чтобы параллельные задания планировались в последовательном порядке (если вы все еще следуете). То есть:

  1. У A.
  2. Подождите A, сделайте B.
  3. Подождите B, сделайте 2+ версии C все одновременно.

Я думал, что у него две очереди redis, serial_queue, на которой есть только один рабочий. И parallel_queue, на котором есть несколько работников.

serial_queue.schedule(
    scheduled_time=datetime.utcnow(),
    func=job_a,
     ...)    
serial_queue.schedule(
    scheduled_time=datetime.utcnow(),
    func=job_b,
     ...)

def parallel_c():
    for task in range(args.n_tasks):
        queue_concurrent.schedule(
            scheduled_time=datetime.utcnow(),
            func=job_c,
            ...)

serial_queue.schedule(
    scheduled_time=datetime.utcnow(),
    func=parallel_c,
     ...)

Но эта настройка в настоящее время дает ошибку, которую AttributeError: module '__main__' has no attribute 'schedule_fetch_tweets'. Как я могу правильно упаковать эту функцию для python-rq?

Теги:
redis
python-rq

1 ответ

1

Решение требует немного гимнастики, поскольку вам нужно импортировать текущий скрипт, как если бы это был внешний модуль.

Так, например. Содержимое schedule_twitter_jobs.py будет:

from redis import Redis
from rq_scheduler import Scheduler
import schedule_twitter_jobs
# we are importing the very module we are executing

def schedule_fetch_tweets(args, queue_name):
    ''' This is the child process to schedule'''

    concurrent_queue = Scheduler(queue_name=queue_name+'_concurrent', connection=Redis())
    # this scheduler is created based on a queue_name that will be passed in
    for task in range(args.n_tasks):
        scheduler_concurrent.schedule(
            scheduled_time=datetime.utcnow(),
            func=app.controller.fetch_twitter_tweets,
            args=[args.statuses_backfill, fill_start_time])

serial_queue = Scheduler(queue_name='myqueue', connection=Redis())
serial_queue.schedule(
'''This is the first schedule.'''
   scheduled_time=datetime.utcnow(),
   func=schedule_twitter_jobs.schedule_fetch_tweets,
   #now we have a fully-qualified reference to the function we need to schedule.
   args=(args, ttl, timeout, queue_name)
   #pass through the args to the child schedule
   )

Ещё вопросы

Сообщество Overcoder
Наверх
Меню