Я пытаюсь значительно сократить время работы MySQL, используя многопоточность. У меня есть несколько серверов с 700+ БД, где мне нужно выполнить ~ 22 запроса на каждом.
Я пытался использовать MySQLdb, asyncio и ThreadPoolExecutor, но продолжаю получать ошибку сегментации. Честно говоря, я не уверен, что это лучший подход, и не уверен, что кодирую это правильно.
#!/usr/bin/env python3
import asyncio
from concurrent.futures import ThreadPoolExecutor
from logging.handlers import SysLogHandler
import sys
import os
import configparser
import datetime
import logging
from logging.handlers import SysLogHandler
import MySQLdb
def setup():
#Some Setup stuff here
event_loop = asyncio.get_event_loop()
try:
event_loop.run_until_complete(Main(dbServers, mySQLuser, mySQLpass, db_ignore_list, trunc_date.strftime("%Y-%m-%d %H:%M:%S"), logger))
finally:
event_loop.close()
async def Main(dbServers, mySQLuser, mySQLpass, db_ignore_list, trunc_date, logger):
try:
db = MySQLdb.connect(host=dbServers, user=mySQLuser, passwd=mySQLpass)
except:
logger.critical('Error connecting to the Database server {}'.format(dbServers))
quit()
cur = db.cursor()
cur.execute('SHOW DATABASES')
databases = [item[0] for item in cur.fetchall()]
db_list = list(set(databases) - set(db_ignore_list))
# Generator Object for .map
args = ((db,s,trunc_date) for s in db_list)
with ThreadPoolExecutor(max_workers=5) as executor:
executor.map(lambda p: archive_table(*p), args)
db.close()
def archive_table(db, schema, trunc_date):
cur = db.cursor()
db.select_db(schema)
cur.execute('SOME SQL') #x22
cur.execute('SOME SQL') #x22
cur.execute('SOME SQL') #x22
cur.execute('SOME SQL') #x22
db.commit()
if __name__ == '__main__':
setup()```
Segmentation fault (core dumped)