在 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获取地理位置