Python 在其余代码分别运行时,持续检查网络可用性
我正在用Python编写代码来设计软件应用程序。我想在我的代码中添加以下功能: 当用户开始使用软件时,将运行一个Python 在其余代码分别运行时,持续检查网络可用性,python,Python,我正在用Python编写代码来设计软件应用程序。我想在我的代码中添加以下功能: 当用户开始使用软件时,将运行一个ping()函数,并尝试连接到internet以获取一些数据。如果网络不可用,则应持续检查网络可用性以获取数据。当那个ping()在不断地检查网络时,我希望我的软件应用程序做一些平常的事情 我的代码是: def ping(): global lst1 if network_connection() is True: links = lxml.html.p
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回答中的指数退避。但是,您避免了OPdef ping()的尾部递归:。。。ping()
在Python中,如果超过最大递归深度,最终将抛出一个运行时错误。@msw感谢您注意到我,是的,您是对的,我对该值过于乐观。我不喜欢指数退避,因为它只需要很少的迭代就可以在重试之间造成显著的延迟。我不是说你必须使用EB,但我很高兴你知道这一点。您可以每秒ping一个站点,但仍然不会浪费太多带宽。然而,如果投票间隔下降了1秒,那么很有可能下降2秒,等等。即使你将投票间隔限制在16秒,这仍然是另一种选择的16倍。礼貌重要吗?这不是一个技术问题;)