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__ 方法的主要内容,如果未能解决你的问题,请参考以下文章