我正在使用帶有燒瓶的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
提交
取消