Имеет ли значение порядок ожидаемых операторов в Python в сочетании с синхронными вызовами? - PullRequest
0 голосов
/ 23 октября 2018

Имеет ли смысл перемещать операции, которые можно ожидать, в начало метода, чтобы иметь возможность выполнять работу, пока они ожидаются?

Пример

в логическом порядке

async def set_new_password(user_id, new_password):
    hash = bcrypt(new_password)
    db_handle = await async_get_db_handle()
    await async_write_password(db_handle, user_id, hash)

Здесь Afaiu Python вычислит хеш, затем создаст сопрограмму для дескриптора db, затем сопрограмму для операции записи и затем передаст управление циклу событий, который будет планировать обе операции.

В этом случае, предполагая, что это наш единственный вызов метода, мы «потратили» время на хеширование пароля, и следующее будет быстрее:

синхронно как можно позже

async def set_new_password(user_id, new_password):
    db_handle = await async_get_db_handle()
    hash = bcrypt(new_password)
    await async_write_password(dh_handle, user_id, hash)

Здесьпока ожидается db_handle, пароль будет хэширован, поэтому мы будем использовать «время простоя», чтобы сделать что-то полезное.

Поэтому я должен стремиться всегда ставить не ожидаемые операторы как можно позже, поэтомучто они могут быть выполнены, пока ожидаются ожидаемые операторы?

1 Ответ

0 голосов
/ 23 октября 2018

... пока ожидается db_handle, пароль будет хэширован, поэтому мы будем использовать "время простоя", чтобы сделать что-то полезное.

Не думаю, что этоправильный.Эффект await заключается в предотвращении выполнения следующей строки до тех пор, пока не будет возвращен дескриптор db_handle.Это заставляет вызывающий код вести себя как синхронный код, поэтому применяются обычные правила упорядочения.

Если вы хотите выполнить некоторую работу при получении дескриптора, вы можете использовать Task .

async def set_new_password(user_id, new_password):
    task = asyncio.create_task(get_db_handle())
    hash = bcrypt(new_password)
    db_handle = await task
    await async_write_password(db_handle, user_id, hash)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...