Как проверить, блокирует ли функция или нет? - PullRequest
1 голос
/ 03 апреля 2019

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


async def download_upload_xmls_async(message,count,id,conn1,cursor1,conn2,cursor2):
    # SOME CODE
    xml = await req(urlX, headers)

    print('Got message')

    write(message_count, id, conn1, cursor1)
    print('Wrote progress')

    send_message("Send" + xml, id, conn2, cursor2)
    print('Sent message')

    write_locally(data)

    await message.ack()

В приведенном выше коде как проверить, что функции write и send_message не блокируют?Они работают с БД, что я не могу получить доступ, чтобы проверить, все ли работает, как ожидалось.Также могу ли я предположить, что если функция write_locally работает правильно, то мои предыдущие функции также работали правильно?

Функции write и send_message выполняют почти одно и то же - они принимают данные и выполняют запрос к базе данных PostgreSQL, используя соединение, и курсор передается вих.Функция write_locally делает запись в CSV-файл.

def send_message(message, id, con, cur, **nargs):
    params = {
              #some params
             }
    union_params= {**params, **nargs}
    data = json.dumps(union_params, ensure_ascii=False)
    cur.execute(
                #Query
                )
    con.commit()

Также я должен добавить, что соединение и курсор были созданы с помощью aiopg, поэтому все их методы являются сопрограммами.

1 Ответ

1 голос
/ 03 апреля 2019

Если у соединения и курсора есть сопрограммные методы, то send_message, как написано, не будет блокировать цикл обработки событий.

Однако, он не будет делать ничего, потому что не может ждут сопрограмм, которые он вызывает.Его нужно определить с помощью async def и await для вызовов cur.execute(...) и cur.commit().download_upload_xmls_async аналогично не ждет send_message.Правильный код должен выглядеть так:

async def download_upload_xmls_async(message, count, id, conn1, cursor1, conn2, cursor2):
    ... some code here ...
    # note the await
    await send_message("Send" + xml, id, conn2, cursor2)
    # write_locally doesn't need to be a coroutine because
    # it (presumably) doesn't block    
    write_locally(data)
    await message.ack()

# note "async def"
async def send_message(message, id, con, cur, **nargs):
    params = {
              #some params
             }
    union_params= {**params, **nargs}
    data = json.dumps(union_params, ensure_ascii=False)
    # note the await
    await cur.execute(
                #Query
                )
    await con.commit()
...