类型错误:无法使用 RQ '_thread.lock'对象进行酸洗



我使用带烧瓶的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)

最新更新