Скрипт на Python для отображения звездочки во время ожидания 10 секунд

#python #asterisk #agi

#python #звездочка #agi

Вопрос:

Я пытаюсь перевести вызов «на удержание» в asterisk с помощью скрипта python AGI, функция проверит, доступен ли пользователь, когда он будет доступен, asterisk наберет номер пользователя, если его нет, скрипт должен подождать 10 секунд, прежде чем снова проверять доступность, и набрать, когда пользователь будет доступен. Однако я столкнулся с небольшой проблемой: использование time.sleep(10) функции прерывает вызов, когда пользователь недоступен, я полагаю, это связано с тем, что поток, в котором выполняется скрипт, переходит в спящий режим, а asterisk думает, что скрипт завершен, и прерывает вызов. Удаление time.sleep() дает мне то, что я хочу, без временного интервала.

 agi = AGI()
agi.verbose("python agi started")
place_call_on_hold("SIP/6001")

def place_call_on_hold(s):
  agi.verbose("entered place_call_on_hold function")
  while True:
    status = agi.get_variable('DEVICE_STATE(%(redirect)s)'%{'redirect':s})
    agi.verbose(status)
    if status == 'NOT_INUSE':
      agi.verbose("Info: place_call_on_hold: calling the number")
      agi.appexec("Dial",s)
    else:
      agi.verbose("Info: place_call_on_hold: sleeping for 10 sec")
      time.sleep(10)
  

Есть ли способ подождать 10 секунд без использования sleep() функции или как я могу убедиться, что вызов не завершится до того, как time.sleep произойдет резервное копирование?

Комментарии:

1. У while() цикла нет условия остановки?

2. останавливаться не нужно, либо вызывающий абонент вешает трубку, и скрипт останавливается, либо вызов перенаправляется абоненту.

3. Должно быть условие, которое проверяет КАНАЛ (состояние).

4. @arheops я не уверен, понимаю ли я, что вы имеете в виду.

5. НИКОГДА не используйте бесконечный цикл в agi. Он будет зацикливаться и потреблять ваш процессор в любой версии asterisk выше 1.4

Ответ №1:

почему бы не попробовать разницу во времени до состояния и после состояния что-то вроде этого

 import time

start = time.time()
end = time.time()

while (end-start) < 10:
    end = time.time()
print(start, end, end-start)
  

Комментарии:

1. Спасибо за ответ, но это будет то же самое, что удалить sleep (), потому что он все равно будет повторять цикл при каждом тике. Я исправил свою проблему, просто вызвав функцию ожидания Asterisk (10).

Ответ №2:

Я исправил свою проблему, просто вызвав функцию Asterisk Wait (10) вместо time.sleep (10).

Комментарии:

1. Вы можете принять свой собственный ответ, чтобы закрыть вопрос.

2. я не могу принять его в течение 2 дней после публикации (осталось 22 часа, прежде чем я смогу его принять)