2013-07-26 3 views
3

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

Когда пользователь начинает использовать программное обеспечение, запускается функция ping() и пытается подключиться к Интернету для получения некоторых данных. Если сеть недоступна, она должна постоянно проверять доступность сети для извлечения данных. В то время как ping() постоянно проверяет сеть, я хочу, чтобы мое программное приложение выполняло обычные вещи.

Мой код:

def ping(): 
    global lst1 
    if network_connection() is True: 
     links = lxml.html.parse("http://google.com").xpath("//a/@href") 
     for url in links: 
      lst1.append(url) 
    else: 
     ping() 

def network_connection(): 
     network=False 
     try: 
      response = urllib2.urlopen("http://google.com", None, 2.5) 
      network=True 

     except urllib2.URLError, e: 
      pass 
     return network 

При запуске приложения я называю ping() и внутри ping() функции Я делаю рекурсивный вызов. Это явно неправильно, потому что в этом случае мой код будет застревать в этом рекурсивном вызове до тех пор, пока не будет доступно сетевое соединение, и приложение не будет инициировано.

В любом случае, я могу делать обе вещи бок о бок: проверять доступность сети и работать остальную часть кода одновременно?

+0

Возможно многопоточное обслуживание? –

+0

В случае поломки сети, должно ли ваше приложение делать какие-то другие вещи или ждать? – Karthikeyan

+0

Он должен делать некоторые другие вещи в случае поломки сети. – user2460869

ответ

1

Прежде всего, нет необходимости в непрерывном пинге, даже если это происходит в отдельном процессе/потоке. Вы должны использовать exponential backoff algorithm.

И если процесс pinging обновляет общую переменную в случае сбоя сети, убедитесь, что ваш основной процесс ждет, пока сеть не будет работать в автономном режиме. Для этого ваш код должен периодически проверять переменную во время выполнения. Я бы предложил multiprocessing module for this task.

0

Есть два способа (что я могу придумать) сделать это.


: Каждый процесс выключается в течение очень короткое количества времени. Процесс пинга() будет действовать, то программное обеспечение будет действовать, то процесс пинга() будет действовать, и т.д.

Однако:

  • Каждого процесс будет немного лагом, в зависимости от того, как быстро переключение.

  • Будет потеряно время переключения между процессами.


: Используйте multiprocessing библиотеки (Python).

«многопроцессорная обработка» - это пакет, который поддерживает процессы нереста с использованием API, аналогичного модулю потоковой передачи. Пакет многопроцессорности предлагает ... ... параллелизм ... Модуль многопроцессорности позволяет программисту полностью использовать несколько процессоров на данная машина работает как в Unix, так и в Windows ».

  • Если процессы не связаны друг с другом, они должны выполняться быстро и плавно.

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

Удачи вам!

1

Вы можете легко использовать цикл while, чтобы постоянно проверять доступность сети внутри функции ping(). Я полностью согласен с ответом Blue Ice на использование процессора, когда код постоянно проверяет подключение к Интернету. Один сигнал time.sleep() от модуля time достаточно, чтобы дросселировать цикл.

import time 

def ping(): 
    global lst1 
    status = True 
    while(status): 
     if network_connection() is True: 
      links = lxml.html.parse("http://google.com").xpath("//a/@href") 
      status = False 
      for url in links: 
       lst1.append(url) 
     else: 
      time.sleep(0.1) #use 100 milliseconds sleep to throttke down CPU usage 
+0

Ожидание соединения вниз для восстановления в 100 мс довольно оптимистично. См. Экспоненциальный откат в ответ от @ Karthikeyan. Тем не менее, вы избегали хвостовой рекурсии OP 'def ping(): ... ping()', который в Python в конечном итоге выкинет «RuntimeError» для превышения максимальной глубины рекурсии. – msw

+0

@msw Спасибо, что заметили меня, и да, вы правы, я был слишком оптимистичен по этому поводу. Я не был в Экспоненциальном отсрочке, потому что он вызывает значительную задержку между попытками с несколькими итерациями. – comepradz

+0

Я не говорю, что вы должны использовать EB, но я рад, что вы знаете об этом. Вы можете пинговать сайт каждую секунду и все равно не тратить много трафика. Однако, если он снизился на 1 с, тогда шансы высоки, он будет вниз на 2 с и т. Д. Даже если вы закроете свой интервал опроса максимум в 16 с, это все равно в 16 раз больше вежливо, чем альтернатива. Вежливость важна? Это не технический вопрос;) – msw

Смежные вопросы