Как использовать одно и то же соединение пула соединений в разных модулях с многопоточностью? - PullRequest
0 голосов
/ 30 мая 2020

Мне нужно ускорить вставки в мою MySQL таблицу, в настоящее время у меня 6 вставок в секунду, но мне нужно около 60 в секунду, потому что мне нужно проанализировать характеристики около 300000 автомобилей с помощью Python и вставить соответствующие характеристики каждого автомобиля в базе данных.

Я использую 4 разных модуля для работы:

  1. module1 - менеджер подключений
  2. module2 - Главный модуль, который содержит всю информацию о машинах и создает несколько потоков.
  3. module3 - Модуль, который имеет некоторые функции, которые модуль2 использует при анализе каждой машины. Этот модуль отправляет запросы в базу данных каждый раз, когда он используется.
  4. module4 - Модуль, который имеет некоторые функции, которые использует module3. Этот модуль также отправляет запросы в базу данных каждый раз, когда он используется.

Во время моих исследований по ускорению работы я обнаружил, что лучшим решением в моем случае является использование потоковой передачи. автомобилей одновременно, каждый протектор анализирует один автомобиль параллельно, параллельно выполняя запросы в БД, чтобы найти информацию об автомобиле, а затем сохранять характеристики автомобиля в БД.

Проблема в том, если я открывать и закрывать соединение каждый раз, когда module3 и module4 используются ступенями, это занимает много времени, процесс открытия соединения занимает много времени, для работы какой многопоточности мне пришлось создать соединение, для лучшей организации я решил создать отдельный модуль (module1), который создает пул соединений и управляет соединениями, я хочу создать соединение в модуле 1 и импортировать соединение в модуле 3 и в модуле 4, проблема в том, что я не знаю, как делать каждый для каждого потока, всегда использовать одно и то же соединение независимо от модуля, например t hread1 использует cnx1 во всех модулях, thread2 использует cnx2 во всех модулях. Это лучший подход к проблеме, и как мне это сделать? Ниже приведен код моего модуля 1.

Примечание: я уже храню некоторое количество автомобилей в памяти и вставляю их, чтобы увеличить скорость вставки.

class CompanyDB:
    db = 'company_name'
    def __init__(self):
        self.cnx_pool = None

    def create_pool(self):
        if self.cnx_pool is not None:
            print('database pool already created, using same pool')
            return self.cnx_pool
        else:
            self.cnx_pool = mysql.connector.pooling.MySQLConnectionPool(pool_name="xxxx",
                                                                  pool_size=10,
                                                                  pool_reset_session=True,
                                                                  host='xxxx.com',
                                                                  database='xxxx',
                                                                  user='xxxx',
                                                                  password='xxxx')
            print('created autoexp pool')
            return self.cnx_pool


    def close(self):
        self.close()
        print('connection closed')


    def get_cnx_from_pool(self):
            cnx  = self.cnx_pool.get_connection()
            print('got connection of company db')
            return cnx

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