我正在用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 :(得分: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上运行。“
小费 - 不要试图持续检查互联网。这将使处理器非常热。相反,在每次检查之间加入一小段延迟。
祝你好运!