Что означает «опрос» и что именно делает этот код? - PullRequest
2 голосов
/ 29 мая 2019

В настоящее время я создаю скрипт на python, который включает и отключает определенные порты на коммутаторах, чтобы посмотреть, как коммутатор будет действовать в целях обеспечения качества.Я использовал библиотеку Python под названием paramiko, которая реализует SSH для подключения к любым устройствам, которые я хочу, и я имею в виду устаревший код, переданный одним из моих товарищей по команде, чтобы написать больше сценариев.В одном из устаревших файлов кода есть функция _run_poll, и я не понимаю, что именно она делает.

Я пытался провести некоторое исследование о том, что означает "опрос" в отношении SSH, но яЯ до сих пор не понимаю, что происходит, когда мы проводим «опрос».Определение для этого кажется немного расплывчатым.Вот функция:

def _run_poll(self, session, timeout, input_data):

    interval = 0.1
    maxseconds = timeout
    maxcount = maxseconds / interval


    i = 0
    timeout_flag = False
    self.info('polling (%d, %d)' % (maxseconds, maxcount))
    start = datetime.datetime.now()
    start_secs = time.mktime(start.timetuple())
    output = ''
    session.setblocking(0)
    while True:
        if session.recv_ready(): # returns true if data has been buffered
            data = session.recv(self.bufsize) # receive data from the channel
            output += data
            self.info('read %d bytes, total %d' % (len(data), len(output)))

            if session.send_ready(): 
                # We received a potential prompt.
                # In the future this could be made to work more like
                # pexpect with pattern matching.
                if i < len(input_data):
                    data = input_data[input_idx] + '\n'
                    i += 1
                    self.info('sending input data %d' % (len(data)))
                    session.send(data)

        self.info('session.exit_status_ready() = %s' % (str(session.exit_status_ready())))
        if session.exit_status_ready():
            break

        # Timeout check
        now = datetime.datetime.now()
        now_secs = time.mktime(now.timetuple())
        et_secs = now_secs - start_secs
        self.info('timeout check %d %d' % (et_secs, maxseconds))
        if et_secs > maxseconds:
            self.info('polling finished - timeout')
            timeout_flag = True
            break
        time.sleep(0.200)

    self.info('polling loop ended')
    if session.recv_ready():
        data = session.recv(self.bufsize)
        output += data
        self.info('read %d bytes, total %d' % (len(data), len(output)))

    self.info('polling finished - %d output bytes' % (len(output)))
    if timeout_flag:
        self.info('appending timeout message')
        output += '\nERROR: timeout after %d seconds\n' % (timeout)
        session.close()

    return output

Я не могу найти много онлайн-ресурсов, чтобы описать то, что здесь происходит или о "опросе" в целом.Может ли кто-нибудь помочь мне объяснить, что такое «опрос» и что здесь происходит?

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Существует два способа обработки асинхронных событий в программировании.

Один из способов - использовать прерывания: у вас есть код, который не выполняется до тех пор, пока «не разбудит» какой-то механизм, и затем он выполнится.Этот механизм должен поддерживаться на более низком уровне, чем там, где выполняется ваш код.Например, в микроконтроллеры встроено специальное аппаратное обеспечение, которое может прерывать приложение и переходить по определенному адресу, чтобы начать выполнение инструкций для обработки прерывания.

Построение системы прерываний является сложным процессом и требует значительных затрат.объем работы.Для некоторых приложений это просто невозможно.Почти всегда легче (хотя и менее эффективно) опрашивать или проверять условие несколько раз, пока оно не станет Истиной, а затем выполнить что-то еще.

В вашем примере обратите внимание, как он использует цикл while True:.True никогда не будет False, поэтому цикл while может быть прерван только оператором break.Мы находим этот оператор break в

if session.exit_status_ready():
            break

Так что автор этого кода решил что-то делать непрерывно, пока session.exit_status_ready() не станет True.Поскольку это paramiko, вполне вероятно, что он выполнил удаленную команду через SSH и ожидает, пока команда завершит работу и вернет код выхода.Смысл этого цикла состоит в том, чтобы держать программу в цикле, пока команда не завершит выполнение и не вернет результат.Время ожидания также может составлять:

if et_secs > maxseconds:
            self.info('polling finished - timeout')
            timeout_flag = True
            break

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

Как только она выйдет из цикла, она напечатает:

self.info('polling loop ended')

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

Точка опроса заключается в повторной проверке чего-либо до появления определенного условия.В вашем случае это условие «удаленная команда завершила выполнение» или «прошло определенное время».

0 голосов
/ 29 мая 2019

Статья в Википедии о Опрос определяет его как:

Активная выборка состояния внешнего устройства клиентской программой как синхронное действие.


В вашем коде это означает, что он регулярно (каждые 200 мс) проверяет соединение SSH на наличие входящих данных и наличие свободной емкости в очереди вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...