Python потоков и соединений с базой данных - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь использовать потоки, чтобы вытащить данные в сеть и выгрузить их в базу данных. Моя настройка выглядит примерно так:

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.

Возможно, что мой дизайн шаблон здесь полностью отключен. Как правильно устроить такое?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...