在RQ中列出实例方法或对象?

时间:2015-09-22 21:55:24

标签: python python-rq

因此,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

我如何解决这个问题?我做错了什么,或者图书馆坏了吗?

1 个答案:

答案 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以在您的处理函数代码中执行查找