因此,RQ明确指出我可以将对象here的实例方法排入队列,所以我一直试图这样做,但得到PicklingError
:
q.enqueue(some_obj.some_func, some_data)
*** PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
真的,我只需要在我的方法中访问SQL连接,所以我试着让它成为一个明确接受SQL连接的函数。那也失败了:
q.enqueue(some_func, sql_sess, some_data)
*** PicklingError: Can't pickle <class 'sqlalchemy.orm.session.Session'>: it's not the same object as sqlalchemy.orm.session.Session
我如何解决这个问题?我做错了什么,或者图书馆坏了吗?
答案 0 :(得分:0)
在排队作业时,尝试对您的阻止功能输入进行的酸洗。
与您类似,我最初的代码在SQLAlchemy对象中传递到我的排队函数中。此代码位于名为 init .py。
的文件中user_emails = session.query(UserEmail).all()
for sql_alchemy_email_object in emails:
q.enqueue(parse_email_function, sql_alchemy_email_object)
产生了PicklingError。我为解决这个问题所做的是通过一个ID对parse_email_function中的SQLAlchemy映射的email_object进行单独查找。
然后我在 init .py:
中将代码更改为此user_email_ids = [email.id for email in session.query(UserEmail).all()]
for email_id in user_email_ids:
q.enqueue(parse_email_function, email_id)
然后,在包含parse_email_function的文件中,我通过传递给parse_email_function()的ID从SQLAlchemy中获取了单独的Email对象。
由于您询问了解决此问题的方法,避免这种情况的一种方法是简单地避免将Object直接传递给您的处理函数,而是传入静态ID以在您的处理函数代码中执行查找