celery使用eventlet模式task中操作django的orm报错解决
若celery使用eventlet模式task中操作django的orm会出现报错如下
django.db.utils.DatabaseError: DatabaseWrapper objects created in a thread can only be used in that same thread.
结论与解决方法
结论
原因是eventlet对thread的获取线程id的方法get_ident()进行了重写,导致celery创造的线程id 和 如果用原生的thread的get_ident()获取的id不一样。
而django的db模块的代码,在数据库操作关闭时,会对创建这个连接进行验证是否是同 一个thread进行操作,如果不是一个操作,就会报错。验证是否为同一个id就是用原生的thread的get_ident()获取线程的id,导致报错
那解决方法就从双方获得的线程id需一致入手。
解决方法:
一.直接对eventlet.g