#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 Я добавил код.