Python 在Keras中使用生成器的多处理时,如何为每个fork建立单独的数据库连接?
我正在将Keras与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()期间连接到数据库: 我假设每个历元都需要一个单独的连接,但不幸的是,在历元开
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)