Асинхронная запись Python в базу данных

#python #multithreading #asynchronous #google-cloud-platform #dialogflow-es

# #python #многопоточность #асинхронный #google-облачная платформа #dialogflow-es

Вопрос:

Я пытаюсь записать в Cloud SQL (MySQL) из выполнения Dialogflow. Серверная часть размещена в App Engine, и я получаю доступ к облачному SQL, используя общедоступный IP (другие приложения также используют ту же БД, поэтому на данный момент у меня нет возможности использовать частный IP). В принципе, все работает, но запись в БД занимает больше времени, чем разрешенный период сеанса, поэтому я получаю ошибку DEADLINE_EXCEEDED в Dialogflow.

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

Например:

 .
.
.
# Take input from users.
# Save them in variables.
# Make a JSON file

write_to_db(JSON_file)
# Don't wait for the response from the above funciton
.
.
.
# Continue with the rest and return if necessary
 

Есть ли какие-либо способы добиться этого в python?

Редактировать

Код, который записывает в облачный SQL.

 import sqlalchemy
import logging
import os

connection_name = ""
db_name = ""
db_user = ""
db_password = ""
driver_name = 'mysql pymysql'
query_string = dict({"unix_socket": "/cloudsql/{}".format(connection_name)})

.
.
.
def insert_reservation():
    REST_ID = "0010"
    RESV_ID = "0020"
    RESV_DT = "12082020"
    USER_ID = "1234"
    RESV_TM = "1040"
    RESV_PERSON_NU = "4"
    USER_COMMENT = "some Comment"
    stmt = sqlalchemy.text("INSERT INTO table_name (REST_ID, RESV_ID, RESV_DT, USER_ID, RESV_TM, RESV_PERSON_NU, USER_COMMENT) values ('{}', '{}', '{}', '{}', '{}', '{}', '{}');".format(
        REST_ID,
        RESV_ID, 
        USER_ID,
        RESV_DT,
        RESV_TM,
        RESV_PERSON_NU,
        USER_COMMENT
    ))
    db = sqlalchemy.create_engine(
      sqlalchemy.engine.url.URL(
          drivername=driver_name,
          username=db_user,
          password=db_password,
          database=db_name,
          query=query_string,
      ),
      pool_size=5,
      max_overflow=2,
      pool_timeout=30,
      pool_recycle=1800
    )
    try:
        with db.connect() as conn:
            conn.execute(stmt)
    except Exception as e:
        logging.info("SQL Error: {}".format(str(e)))
        #return 'Error: {}'.format(str(e))
    
    return 'ok'
.
.
.
 

Как упоминалось ранее, это работает нормально, но единственная проблема в том, что это происходит медленно. Есть предложения по повышению скорости или передать ее другому потоку для ее обработки?

Комментарии:

1. Вы можете использовать любую асинхронную работу. rq, сельдерей приходит на ум, если вы размещаете на обычных виртуальных машинах, а если вы размещаете на Google, у них есть облачные задачи.

2. Помимо внешних вызовов API (облачные задачи, Pub / Sub), можете ли вы предложить какие-нибудь библиотеки python, которые выполняют эту работу в облаке?

3. В зависимости от того, как вы размещаете приложение, вы можете просто threading.Thread(target=write_to_db, args=(JSON_file,)).start() надеяться на лучшее

4. Можете ли вы поделиться кодом, который вы используете для записи в Cloud SQL из Dialogflow?

5. @AlexandreMoraes Я добавил код.