前提: Django / django_apscheduler / django_redis
当使用 add_job的时候scheduler.add_job(SelfApscheduler().utils, "interval", seconds=group_port_scan, args=[], id="port_scan_data", replace_existing=True, misfire_grace_time=10)
,
报错TypeError: can’t pickle _thread.lock objects
x
原因: 任务中将 redis_conn = get_redis_conn() 当做了 类变量self.redis_conn 例如:
class SelfApscheduler():
def __init__(self):
self.redis_conn = get_redis_conn()
self.redis_conn_event = get_redis_conn("event")
def utils1(self):
self.redis_conn.set("name", "小小")
def utils2(self):
self.redis_conn_event.set("age", 20)
def util(self):
self.utils1()
self.utils2()
报错: TypeError: can't pickle _thread.lock objects
原因:get_redis_conn 方法被当做类变量时,启用了多线程, 而 add_job时是开启了一个线程,执行该任务时只允许一个线程,
解决方式:
class SelfApscheduler():
def __init__(self):
pass
def utils(self):
redis_conn = get_redis_conn()
redis_conn.set("name", "小小")
def utils2(self):
redis_conn_event = get_redis_conn()
redis_conn_event.set("age", 20)
def util(self):
self.utils1()
self.utils2()