在 Celery 任务中使用 GeoIP 进行地理定位的正确方法

Proper way of doing Geolocations using GeoIP inside a Celery task

所以,我有一个调用 Celery 任务的 Django 中间件。此任务查询 GeoIP2 数据库以定位给定的 IP 地址并执行一些额外的处理。在简化形式中,celery 任务如下所示:

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

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

    # some other code...

问题是,这个 celery 任务可能每秒被调用数千次,这将导致 g = GeoIP2() 客户端在每次处理任务时都被初始化。我可以将此语句移到函数之外,以便客户端仅初始化一次,然后传递给每个任务吗?在这种情况下我应该把它移到哪里?

您可以将它移到方法范围之外,并在方法内部将其作为全局变量使用。

g = GeoIP2()

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

    global g

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