pymongo 集合对象序列化 __getnewargs__ 方法

Posted

技术标签:

【中文标题】pymongo 集合对象序列化 __getnewargs__ 方法【英文标题】:pymongo collection object serializing __getnewargs__ method 【发布时间】:2015-02-11 11:47:47 【问题描述】:

当我尝试使用 celery 运行任务时,Pymongo 集合对象失败。我猜它无法序列化它。我该怎么办?顺便说一句,我试过泡菜,但它对我没有帮助。

PS:我不想让全局数据库导入到这个模块。

'Collection' 对象不可调用。如果您打算调用 'getnewargs' 方法....

示例代码如下。 module.py

from celery.contrib.methods import task_method



class Some_Class(object):
    """docstring for Some_Class"""
    def __init__(self, db):
        super(Some_Class, self).__init__()
        self.db = db  # This object causes 'Collection' object is not callable
        #db is a pymongo collection object from db.py


    @app.task(filter=task_method)  # Celery task
    def add(self):
        """
        db.insert('some_key':'some_value')
        """
        return 3

db.py

from pymongo import MongoClient    
db = MongoClient()['test']['collection']

【问题讨论】:

如果您正在寻找导致对象可序列化失败的原因,您可以尝试dill.detect 模块中的方法。 github.com/uqfoundation 您是否在 Windows 机器上运行此代码?由于 Windows 上不存在“fork”,因此可能存在潜在的 fork 问题,因此该对象可能不可拾取,从而导致错误。 【参考方案1】:

您不应该序列化集合对象。而是存储集合 name 并从任务中获取集合对象。

Collection 对象需要关联的已建立 MongoClient 对象图才能使用。如果没有 MongoClient,即使您设法反序列化了一个集合对象,它也无法工作。

【讨论】:

以上是关于pymongo 集合对象序列化 __getnewargs__ 方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pymongo 获取集合的所有文档

遍历 PyMongo 集合

Pymongo 排序错误

MongoDB - PyMONGO 更新一个集合

pymongo实战

为啥 db.insert(dict) 在使用 pymongo 时将 _id 键添加到 dict 对象