Правильный способ выполнения геолокации с использованием GeoIP внутри задачи Celery - PullRequest
0 голосов
/ 30 апреля 2020

Итак, у меня есть Django промежуточное ПО, вызывающее задачу Celery. Эта задача запрашивает базу данных GeoIP2 для определения местоположения данного IP-адреса и выполнения некоторой дополнительной обработки. В упрощенном виде задача сельдерея выглядит следующим образом:

@shared_task(bind=True)
def dump_json_logs(self, data):

    g = GeoIP2()
    location = g.city(data["ip_address"])

    # some other code...

Дело в том, что эту задачу сельдерея можно вызывать тысячи раз в секунду, что приведет к инициализации клиента g = GeoIP2() каждый раз задача выполнена. Можно ли переместить этот оператор за пределы функции, чтобы клиент инициализировался только один раз, а затем передавался каждой задаче? Куда мне его переместить в этом случае?

1 Ответ

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

Вы можете переместить его за пределы области метода и использовать его внутри метода в качестве глобальной переменной.

g = GeoIP2()

@shared_task(bind=True)
def dump_json_logs(self, data):

    global g

    location = g.city(data["ip_address"])
...