Python - Подмена одного метода в библиотеке - Обработка мертвой очереди - Djangoq / qcluster / SQS - PullRequest
0 голосов
/ 31 мая 2018

Я использую djangoq в своем проекте и использую sqs в качестве брокера.Как часть системы я ставлю в очередь некоторые задачи, которые выполняются qcluster и выполняются.Когда некоторые задачи не выполняются, они в конечном итоге попадают в очередь DEAD в SQS.

Теперь, если я добавлю qcluster в эту очередь, задача будет выполнена снова.Но я хочу взять задачу, проверить аргументы, взять PK объектной модели и пометить, что она не удалась.И я нашел то, что мне нужно сделать, это создать новую функцию worker.и заменить по умолчанию.https://github.com/Koed00/django-q/blob/master/django_q/cluster.py#L341

Проблема в том, что проблема по умолчанию вызывается непосредственно из области в файле и не передается в качестве аргументов другим методам.Поэтому мне нужно создать слой абстракции, который бы импортировал из пакета djangoq, внедряя в него новый рабочий метод.И тогда я запускаю qcluster из этого уровня абстракции.

Но на самом деле не знаю, как внедрить новый метод и даже если это возможно или нет.

1 Ответ

0 голосов
/ 31 мая 2018

Я не прочитал весь код, но вы можете (или нет ...) сделать так, чтобы это работало с помощью monkeypatching cluster.worker:

from django_q import cluster
# in case you need to call the original implementation
original_worker = cluster.worker
def myworker(...):
   # your code here
cluster.worker = myworker

# now cluster will use `myworker`

Но это следует рассматривать каквременный обходной путь в лучшем случае.Правильным решением будет форк djangoq, чтобы он по умолчанию использовал только свою собственную worker функцию и позволял вам передавать любые другие вызываемые.

...