Хьюи не вызывает задачи в Django - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть приложение Django rest Framework, которое последовательно вызывает 2 задачи huey в методе создания сериализатора следующим образом:

...
def create(self, validated_data):
    user = self.context['request'].user
    player_ids = validated_data.get('players', [])
    game = Game.objects.create()

    tasks.make_players_friends_task(player_ids)
    tasks.send_notification_task(user.id, game.id)
    return game

# tasks.py
@db_task()
def make_players_friends_task(ids):
    players = User.objects.filter(id__in=ids)
    # process players

@db_task()
def send_notification_task(user_id, game_id):
    user = User.objects.get(id=user_id)
    game = Game.objects.get(id=game_id)
    # send notifications

При запуске процесса huey в терминале, когда я нажимаю эту конечную точку Я вижу, что когда-либо вызывается только одна или другая задача, но не обе. Я запускаю huey с настройками по умолчанию (redis with 1 thread worker.)

Если я изменяю код так, что я передаю сами объекты как параметры, а не идентификаторы, и удаляю django запросы в методах @db_task, кажется, все работает нормально.

Причина, по которой я первоначально использовал идентификаторы в качестве параметров, заключается в том, что я предположил (или где-то прочитал), что Хьюи использует json сериализацию по умолчанию, но после просмотра pickle фактически является сериализатором по умолчанию.

Одна теория состоит в том, что, поскольку я работаю только с одним работником, и у меня есть метод @db_periodic_task в приложении, процесс может обрабатывать только прослушивание задач или их выполнение в любое время, но не оба. Это способ работы сельдерея, когда вам нужен отдельный процесс для планировщика и рабочего, но это не упоминается в документации Хьюи.

1 Ответ

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

Если вы запустите потребитель huey, он фактически создаст отдельный планировщик вместе с указанным вами количеством работников, так что это не будет вашей проблемой.

Вы не предоставляете достаточно информации для на самом деле правильно посмотрите, что идет не так, поэтому проверьте следующее:

  • Если вы запустите потребитель huey в терминале, проверьте, все ли ваши задачи отображаются как должным образом зарегистрированные, чтобы потребитель действительно мог их потреблять. .
  • Проверьте, запущен ли ваш процесс redis.
  • Попробуйте выполнить задачи с помощью вызова блокировки, чтобы увидеть, на каких задачах он не работает:

    task_result = tasks.make_players_friends_task(player_ids)
    task_result.get(blocking=True)
    task_result = tasks.send_notification_task(user.id, game.id)
    task_result.get(blocking=True)
    

    Выполнить это с помощью отладчика или операторов print, чтобы увидеть, доходит ли он до конца вашей функции или где он застревает.

  • Обязательно всегда перезапускайте своего потребителя при изменении кода. Он не получает автоматически новый код, такой как сервер django dev. Тот факт, что ваш код работает так, как задумано, выбирая целые объекты вместо передачи идентификаторов, может указывать на это, поскольку было бы очень странно, что это сломало бы его. С другой стороны, вы не должны передавать django объекты ORM. Имеет смысл использовать ваш идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...