在其余代码单独运行时,连续检查网络可用性

时间:2013-07-26 20:17:41

标签: python

我正在用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()函数内部进行递归调用。这显然是错误的,因为在这种情况下,我的代码将停留在这个递归调用中,直到网络连接可用并且不会启动应用程序。

无论如何,我可以并排做两件事:检查网络可用性并同时运行其余代码?

3 个答案:

答案 0 :(得分:1)

首先,不需要连续ping,即使是在单独的进程/线程中也是如此。您应该使用exponential backoff algorithm

让ping过程在网络出现故障时更新共享变量,以确保主进程等待网络启动/或离线工作。为此,您的代码必须在执行期间定期检查变量。我会建议multiprocessing module for this task.

答案 1 :(得分:1)

您可以轻松使用while循环来不断检查ping()功能中的网络可用性。当代码不断检查互联网连接时,我完全同意Blue Ice关于CPU使用率的回答。来自模块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

答案 2 :(得分:0)

有两种方法(我能想到)来做到这一点。


1 :每个进程都会在很短的时间内关闭。 ping()进程将执行,然后软件将执行,然后ping()进程将执行等。

然而:

  • 每个过程都会有点滞后,具体取决于切换的速度。

  • 流程之间会浪费时间切换。


2 :使用multiprocessing库(python)。

“multiprocessing是一个使用类似于线程模块的API支持产生进程的包。多处理包提供......并发....多处理模块允许程序员充分利用给定的多个处理器它在Unix和Windows上运行。“

  • 如果这些过程不相关,那么它们应该快速,平稳地运行。

小费 - 不要试图持续检查互联网。这将使处理器非常热。相反,在每次检查之间加入一小段延迟。

祝你好运!