exit_code = os.system('ping www.baidu.com>con')
if exit_code:
raise Exception('connect failed.')
print("网络异常")
else:
print("网络正常")
用urllib.urlopen读取, 然后看下是否有“<title>百度一下”之类的关键词比较靠谱, 比如In [1]: import urllib
In [2]: is_online = u'<title>百度一下,你就知道' in urllib.urlopen("http://www.baidu.com/").read().decode('gbk')
In [3]: print is_online
True
如果你用的socket包里的那些阻塞接口,当然写个线程循环监测时间也没啥,只不过记得在循环内加上个sleep,哪怕是1ms甚至1us的sleep都可以避免CPU被消耗干净。如果你所说的接收是死循环式里跑socket.recv,它会在recv里阻塞,按你的说法3分钟一个心跳包,时间检测就成了3分钟一次,不太合适。
更好的办法自然是通过epoll/poll之类的方式或者asyncio/twisted/tornado之类的异步回调/协程加时间事件甚至是各种GUI框架的事件循环来启动你的发送和接收。考虑到以后可能有多设备,显然利用这些成型的玩意更合理。