我使用带烧瓶的RQ来排队循环中的作业。我有以下代码:
from rq import Queue
from rq.job import Job
from worker import conn
q = 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 os
import redis
from rq import Worker, Queue, Connection
listen = ['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()
如何纠正?
我通过从Python 3.8降级到Python 3.7 解决了类似的问题
我的情况有点不同。我正在运行一个Django服务器,它使用Djano-Q调度任务。然而,Django-Q是基于RQ的,并且错误
TypeError:无法pickle'_thread.lock'对象
是由Python的多处理器模块抛出的,所以我相信该解决方案会被翻译。
截至2020年5月,我预计这是一个错误,尽管尚不清楚是什么原因导致的。
TypeError: cannot pickle '_thread.lock' object
此错误主要源于尝试使用pickle序列化不可序列化的对象。您可以通过为Redis((创建一个对象来进行检查,并尝试这样做:
import pickle
r = Redis()
pickle.dumps(r)
它会给你同样的错误。此外,针对您当前的场景。这可能来自
q = Queue(connection=conn)
作为,您正在尝试导入连接conn。你可以这样定义::
q = Queue(connection=Redis())
r = Redis(host='localhost', port=6379, db=0)