Python 在Keras中使用生成器的多处理时,如何为每个fork建立单独的数据库连接?

Python 在Keras中使用生成器的多处理时,如何为每个fork建立单独的数据库连接?,python,tensorflow,keras,multiprocessing,Python,Tensorflow,Keras,Multiprocessing,我正在将Keras与fit\u generator()一起使用。我的生成器连接到数据库(在我的例子中是MongoDB)以获取每个批的数据。如果我使用fit\u generator()的多处理标志,我会收到以下警告: UserWarning: MongoClient opened before fork. Create MongoClient only after forking. 我在\uuuu init\uuuu()期间连接到数据库: 我假设每个历元都需要一个单独的连接,但不幸的是,在历元开

我正在将Keras与
fit\u generator()
一起使用。我的生成器连接到数据库(在我的例子中是MongoDB)以获取每个批的数据。如果我使用
fit\u generator()
的多处理标志,我会收到以下警告:

UserWarning: MongoClient opened before fork. Create MongoClient only after forking.
我在
\uuuu init\uuuu()期间连接到数据库:

我假设每个历元都需要一个单独的连接,但不幸的是,在历元开始(self)
回调上没有可用的
(如图所示)

所以有两个问题:
如果使用多处理,Keras如何以及何时分叉生成器?
如何摆脱MongoClient警告并在每个分叉内部连接

我没有mongo DB可供测试,但这可能会起作用-您可以在每个进程的第一个get项上获取集合(连接?)

类MyCustomGenerator(tf.keras.utils.Sequence):
定义初始化(自…):
self.collection=None
定义(自我):
...
def uu getitem uu(self,idx):
如果self.collection为“无”:
self.collection=MagicMongoDBConnector()
#继续你的代码
#使用集合从mongoDB获取数据
...
终端上的def(自身):
...

如果您使用的是Python 3.7,您可以使用它来触发创建数据库连接

例如,您可以执行以下操作:

from os import register_at_fork

def reinit_dbcon():
    generator_obj.collection = MagicMongoDBConnector()

register_at_fork(after_in_child=reinit_dbcon)

在调用
fit\u生成器之前的某个地方
。假设对象是全局的

,这就成功了。集合基本上是数据库中的选项卡。
from os import register_at_fork

def reinit_dbcon():
    generator_obj.collection = MagicMongoDBConnector()

register_at_fork(after_in_child=reinit_dbcon)