Подтолкнуть результаты одной работы на другую django-rq - PullRequest
0 голосов
/ 07 мая 2018

Я создаю приложение, в котором информация о пользователях часто обновляется из внешних API. Для этого я использую django-rq.

  • Первая работа запланирована один раз в день, чтобы получить пользователей, которым необходимо обновить свои профили.

  • Для каждого результата, возвращенного первым заданием, запланируйте другое задание, чтобы получать информацию о новом пользователе из удаленного API и обновлять пользователя в моей базе данных.

    # tasks.py
    import requests
    from django_rq import job
    
    @job('default')
    def get_users_to_update():
        """Get a list of users to who need update"""
        users = User.objects.filter(some_condition_here...)
        return users
    
    @job('default')
    def remote_update_user(user):
        """Calls external API to get new user information"""
        url = 'http://somwhere.io/api/users/{}'.format(user.id)
        headers= {'Authorization': "Bearer {}".format(user.access_token)}
        # Send the request, probably takes long time
        r = requests.get(url, headers=headers)
    
        data = r.json()  # new user data
        for key, value in data.items():
            setattr(user, key, value)
    
        user.save()
    
        return user
    

Я могу запланировать эти две работы следующим образом:

    # update_info.py
    import django_rq

    scheduler = django_rq.get_scheduler('default')

    scheduler.schedule(
        scheduled_time=datetime.utcnow(),
        func=tasks.get_users_to_update,
        interval=24 * 60 * 60
    )

    scheduler.schedule(
        scheduled_time=datetime.utcnow(),
        func=tasks.remote_update_user,
        interval=24 * 60 * 60
    )

Однако это, конечно, не то, что я хочу. Мне интересно, есть ли способ в django-rq уведомить о завершении get_users_to_update, получить его результаты и запланировать remote_update_user.

rq позволяет depends_on объявить зависимое задание отправленным заданием, но кажется, что такая функция недоступна в django-rq.

...