5

所以,RQ 明确声明我可以在这里加入一个对象的实例方法,所以我一直在尝试这样做,但是得到一个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

我该如何解决这个问题?我做错了什么,还是图书馆刚刚坏了?

4

1 回答 1

1

将作业排入队列时,会在您对阻塞函数的输入上尝试完成酸洗。

与您类似,我最初有将 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 中获取了单个电子邮件对象。

由于您询问了解决此问题的方法,因此避免这种情况的一种方法是简单地避免将 Object 直接传递给您的处理函数,而是传递一个静态 id 以在您的处理函数代码中执行查找。

于 2018-05-03T21:22:07.930 回答