Sqlalchemy Synchronize дочерний и родительский процесс фиксирует - PullRequest
0 голосов
/ 12 сентября 2018

У меня проблема с синхронизацией в sqlalchemy: Я использую postgresql для БД.

Вот что происходит:

  1. Запуск приложения с колбой питона.
  2. Создание заданного долговременного API конечной точки.
  3. В API делаем следующее:

    from multiprocessing import Process
    def commit_unsaved_configuration():   
    
        create_process = Process(target=start_all_group_services, args=())
        create_process.start()
        process_id = create_process.pid
    
        message_response = "Request Accepted at /api/v1/configuration/pending/{}".format(process_id)
        return message_response, 202
    

    Это реализация длинного API, которой я следую. В процессе, запущенном потоком, start_all_group_services я фиксирую все данные в базе данных, используя db_session.commit().

В этом сеансе я создаю отдельный модуль Python и импортирую его следующим образом: from db.config_db import db_session.

Теперь дочерний процесс фиксирует изменения в БД. Это отлично работает. Теперь, когда я пытаюсь вставить новую запись в БД, я получаю следующую ошибку:

    sqlalchemy.exc.InternalError: (psycopg2.InternalError) SAVEPOINT can only be used in transaction blocks
   [SQL: 'SAVEPOINT sa_savepoint_2'] (Background on this error at:   http://sqlalche.me/e/2j85)
   2018-09-12 21:20:35,110 - api_server.controllers.override - ERROR -  InternalError: (psycopg2.InternalError) SAVEPOINT can only be used in  transaction blocks
   [SQL: 'SAVEPOINT sa_savepoint_2'] (Background on this error at:  http://sqlalche.me/e/2j85)

Таким образом, чтобы укорачивать вопрос, блок транзакции BEGIN, запущенный родительским процессом, не завершается, потому что фиксация выполняется в дочернем процессе, но родительский процесс не знает об этом.

Так что мне нужен способ сообщить родителю о коммите. Потому что, если я делаю коммит в родительском процессе, я не получаю ошибку. Но мне нужно, чтобы коммит шел в дочернем процессе из-за потребностей API.

...