在 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"])
所以,我有一个调用 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"])