摘要:我编写了一个有时yields
与开放sqlite3
连接的生成器。但是,我不启用多线程。尽管如此,我收到一个错误,表明我的sqlite3数据库连接被多个线程访问。该怎么办?
我试图像这样训练一个模型:
model3.fit_generator(train_gen3, round(TOTAL_SIZE * (1 - VALID_PCT) / BATCH_SIZE),
epochs = 1, verbose = 1,
validation_data = valid_gen3, validation_steps = round(TOTAL_SIZE * VALID_PCT / BATCH_SIZE))
请注意,我保留了默认的use_multiprocessing
设置,这意味着它应该根据Keras documentation设置为false。然而,在我的第一个训练时代结束时,这个错误被吐出:
sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 140487084246784 and this is thread id 140468885124864
在我的生成器中,我确实打开sqlite3
连接,如下所示:
with sqlite3.connect(self.data_dir + f) as conn:
results = conn.execute("SELECT * FROM tbl")
rows = results.fetchall()
df = pd.DataFrame(rows)
...
if len(x_return_list) == batch_size:
yield (np.array(x_return_list), np.array(y_return_list))
x_return_list = []
y_return_list = []
所以我确实以一个开放的sqlite3
连接屈服,但我认为这不应该是一个问题,因为我没有启用任何形式的线程/多处理。这里发生了什么,最好的解决方法是什么?