Выполнение длинных асинхронных операций синхронным способом - PullRequest
2 голосов
/ 08 ноября 2011

Мне нужно реализовать функцию, которая включает в себя длительную асинхронную операцию (отправлять запрос на внешний сервер и периодически проверять, выполняется ли она), которая должна вести себя как синхронная операция.Я делаю так:

start_long_operation()
while True:
  if operation_finished():
    return
  sleep()  

Интересно, является ли это приемлемым и есть ли лучшее решение?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2011

Вы бы предпочли держаться подальше от голосования. Синхронные операции будут лучше масштабироваться и их будет легче отлаживать. Если у вас есть контроль над внешним протоколом, сделайте его синхронизированным. Я говорю это в основном потому, что я думаю, что многие люди делают вещи асинхронными, думая, что каким-то образом улучшает производительность, когда это действительно только усложняет ситуацию.

Затем вы можете сделать операции синхронизации асинхронными для вашего локального цикла обработки событий, используя несколько потоков управления (потоки, процессы, выбранные автоматы FSM и т. Д.). Если у вас нет контроля над внешним протоколом, и он действительно асинхронный, у вас нет другого выбора, кроме как опросить. В зависимости от того, что, по вашему мнению, будет распределено время отклика, я бы использовал некоторый экспоненциальный откат с ограничением на период опроса. Для большинства программ я бы использовал это внешнее по отношению к моему главному циклу событий и передавал его через какой-либо механизм событий в мой цикл событий.

2 голосов
/ 08 ноября 2011

В зависимости от характера асинхронной операции, существуют различные существующие решения, которые позволят вам сделать это более элегантно.Например, если вы ожидаете ответа от сервера, вы можете использовать select в сокете, чтобы дождаться ответа.Вы также можете сделать это на нескольких сокетах одновременно.

Примечание. Всегда следует использовать тайм-аут, когда это возможно, чтобы избежать вечного ожидания в случае какой-либо ошибки.От этого также страдает цикл, упомянутый в вашем посте - вы должны ограничить общее время или количество итераций.

...