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

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

4

3 回答 3

1

首先,不需要连续 ping,即使发生在单独的进程/线程中。您应该使用指数退避算法

并让 ping 进程在网络故障的情况下更新共享变量,以确保您的主进程等到网络启动/或进行离线工作。为此,您的代码必须在执行期间定期检查变量。我会建议multiprocessing这个任务的模块。

于 2013-07-26T20:33:36.227 回答
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
于 2013-07-26T20:34:48.360 回答
0

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


1:每个进程在很短的时间内关闭。ping() 进程将起作用,然后软件将起作用,然后 ping() 进程将起作用,等等。

然而:

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

  • 在进程之间切换会浪费时间。


2:使用多处理库(python)。

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

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

还有一个提示——不要试图不断地检查互联网。这将使处理器非常热。取而代之的是,在每次检查之间稍作延迟。

祝你好运!

于 2013-07-26T20:28:28.617 回答