import threading from apps.utils.decorators import auto_log from concurrent.futures import ThreadPoolExecutor from django.db import connections # 创建全局线程池 global_executor = ThreadPoolExecutor(max_workers=20) class MyThread(threading.Thread): @auto_log('MyThread', raise_exception=True, send_mail=True) def run(self) -> None: # 子线程退出 / 池内 worker 跑完一次任务后必须关闭本线程的 Django DB 连接, # 否则 psycopg2 连接会一直驻留在线程的 thread-local,导致 PG "too many clients" try: return super().run() finally: connections.close_all() def start_p(self): """ 使用线程池启动 """ global_executor.submit(self.run)