Я пытаюсь использовать потоки, чтобы вытащить данные в сеть и выгрузить их в базу данных. Моя настройка выглядит примерно так:
In config.py
:
from neo4j import GraphDatabase
class db_holder():
def __init__(self):
self.uri = "bolt://localhost:7687"
self.driver = GraphDatabase.driver(self.uri, auth=("user", "pass"))
self.db = self.driver.session()
class cfg_holder():
''' Container for global variables.'''
def __init__(self, params, db_h=None):
self.params = params
self.uri = db_h.uri
self.driver = db_h.driver
self.db = db_h.db
def init(param, db_h):
return cfg_holder(param, db_h=db_h)
In main.py
:
import concurrent.futures
import config
def func(h):
for i in range(h.params):
print(i)
if __name__ == "__main__":
db_h = config.db_holder()
holders = []
for i in [10, 20]:
holders.append(config.init(i, db_h))
with concurrent.futures.ThreadPoolExecutor(max_workers=len(holders)) as executor:
executor.map(func, holders)
Таким образом, каждый cfg_holder
имеет доступ к такое же подключение к базе данных через db_holder
. Я не уверен, что это правильный способ настройки. Когда я запускаю код, одновременно выполняется только один поток. Т.е. на выходе будет 0 1 2 0 1 2 3 4 5
. Если вместо этого я разрешаю каждому cfg_holder
иметь собственное соединение с базой данных (или просто закомментировать часть базы данных), тогда потоки будут работать «параллельно»: 0 0 1 1 2 2 3 4 5
.
Возможно, что мой дизайн шаблон здесь полностью отключен. Как правильно устроить такое?