类型错误:无法使用 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()

如何纠正这种情况?


蛊毒传说
浏览 192回答 2
2回答

呼唤远方

我通过从Python 3.8降级到Python 3.7解决了类似的问题。我的情况有点不同。我正在运行一个Django服务器,它使用Django-Q调度任务。但是,Django-Q基于RQ,并且错误类型错误: 无法腌制“_thread.lock”对象是由Python的多处理模块抛出的,所以我相信解决方案会转换。截至2020年5月,我预计这是一个错误,尽管目前尚不清楚导致它的原因。

阿波罗的战车

TypeError: cannot pickle '_thread.lock' object此错误主要源于您尝试使用 pickle 序列化不可序列化的对象。您可以通过为 Redis() 创建一个对象来检查相同的内容,并尝试执行以下操作:import pickler = Redis()pickle.dumps(r)它会给你同样的错误。此外,对于当前方案。这可能来自q = Queue(connection=conn)因为,您正在尝试导入连接连接。你可以定义这样的东西::q = Queue(connection=Redis())r = Redis(host='localhost', port=6379, db=0)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python