我正在使用带有烧瓶的RQ在循环中排队作业。我有以下代码:from rq import Queuefrom rq.job import Jobfrom worker import connq = Queue(connection=conn)for i in range(5): job = q.enqueue_call( func=process_data, args=(i, data,)) print(job.get_id()) 现在我得到错误:TypeError: cannot pickle '_thread.lock' object我有以下代码的工人:import osimport redisfrom rq import Worker, Queue, Connectionlisten = ['default']redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')conn = redis.from_url(redis_url)if __name__ == '__main__': with Connection(conn): worker = Worker(list(map(Queue, listen))) worker.work()如何纠正这种情况?
2 回答
呼唤远方
TA贡献1856条经验 获得超11个赞
我通过从Python 3.8降级到Python 3.7解决了类似的问题。
我的情况有点不同。我正在运行一个Django服务器,它使用Django-Q调度任务。但是,Django-Q基于RQ,并且错误
类型错误: 无法腌制“_thread.lock”对象
是由Python的多处理模块抛出的,所以我相信解决方案会转换。
截至2020年5月,我预计这是一个错误,尽管目前尚不清楚导致它的原因。
阿波罗的战车
TA贡献1862条经验 获得超6个赞
TypeError: cannot pickle '_thread.lock' object
此错误主要源于您尝试使用 pickle 序列化不可序列化的对象。您可以通过为 Redis() 创建一个对象来检查相同的内容,并尝试执行以下操作:
import pickle
r = Redis()
pickle.dumps(r)
它会给你同样的错误。此外,对于当前方案。这可能来自
q = Queue(connection=conn)
因为,您正在尝试导入连接连接。你可以定义这样的东西::
q = Queue(connection=Redis())
r = Redis(host='localhost', port=6379, db=0)
添加回答
举报
0/150
提交
取消