Python 在其余代码分别运行时,持续检查网络可用性

Python 在其余代码分别运行时,持续检查网络可用性,python,Python,我正在用Python编写代码来设计软件应用程序。我想在我的代码中添加以下功能: 当用户开始使用软件时,将运行一个ping()函数,并尝试连接到internet以获取一些数据。如果网络不可用,则应持续检查网络可用性以获取数据。当那个ping()在不断地检查网络时,我希望我的软件应用程序做一些平常的事情 我的代码是: def ping(): global lst1 if network_connection() is True: links = lxml.html.p

我正在用Python编写代码来设计软件应用程序。我想在我的代码中添加以下功能:

当用户开始使用软件时,将运行一个
ping()
函数,并尝试连接到internet以获取一些数据。如果网络不可用,则应持续检查网络可用性以获取数据。当那个
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()
函数中,我正在进行递归调用。这显然是错误的,因为在这种情况下,我的代码将停留在这个递归调用中,直到网络连接可用并且应用程序将不会启动

我是否可以同时做这两件事:检查网络可用性和同时运行其余代码?

有两种方法可以做到这一点(我可以想到)


1:每个进程关闭的时间非常短。ping()进程将动作,然后软件将动作,然后ping()进程将动作,等等

然而:

  • 每个进程都会有点滞后,这取决于切换的速度

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


2:使用库(python)

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

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

还有一个小贴士-不要试图持续地检查互联网。这将使处理器非常热。相反,在每次检查之间加上一些小的延迟


祝你好运

首先,不需要连续ping,即使是在单独的进程/线程中。你应该使用一个


并让ping进程在网络发生故障时更新一个共享变量,以确保主进程等待网络启动/或进行脱机工作。为此,代码必须在执行期间定期检查变量。我建议使用可以轻松地使用
while
循环来不断检查
ping()函数中的网络可用性。我完全同意Blue Ice在代码持续检查互联网连接时关于CPU使用情况的回答。来自模块
time
的单个
time.sleep()
调用就足以抑制循环

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

多线程可能会对您有所帮助吗?如果网络中断,您的应用程序应该做一些其他事情,还是等待?如果网络中断,它应该做一些其他事情。期待断开的连接在100毫秒内恢复是非常乐观的。参见@Karthikeyan回答中的指数退避。但是,您避免了OP
def ping()的尾部递归:。。。ping()
在Python中,如果超过最大递归深度,最终将抛出一个
运行时错误。@msw感谢您注意到我,是的,您是对的,我对该值过于乐观。我不喜欢指数退避,因为它只需要很少的迭代就可以在重试之间造成显著的延迟。我不是说你必须使用EB,但我很高兴你知道这一点。您可以每秒ping一个站点,但仍然不会浪费太多带宽。然而,如果投票间隔下降了1秒,那么很有可能下降2秒,等等。即使你将投票间隔限制在16秒,这仍然是另一种选择的16倍。礼貌重要吗?这不是一个技术问题;)