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

Posted

技术标签:

【中文标题】在 Celery 任务中使用 GeoIP 进行地理定位的正确方法【英文标题】:Proper way of doing Geolocations using GeoIP inside a Celery task 【发布时间】:2020-04-30 08:59:40 【问题描述】:

所以,我有一个调用 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() 客户端。我可以将此语句移到函数之外,以便客户端仅初始化一次然后传递给每个任务吗?在这种情况下我应该把它移到哪里?

【问题讨论】:

【参考方案1】:

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

g = GeoIP2()

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

    global g

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

【讨论】:

以上是关于在 Celery 任务中使用 GeoIP 进行地理定位的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

Django博客来访人员地域分布大数据可视化---echarts绘图geoip2获取地理位置

Django博客来访人员地域分布大数据可视化---echarts绘图geoip2获取地理位置

我应该保存 GeoIP 数据吗

Logstash geoip 随机故障

你如何对 Celery 任务进行单元测试?

与 celery 正在进行的任务交互