0

我使用 Python 和 Ruby 编写的脚本一次运行数天,并依靠互联网访问某些域并收集数据。有没有办法在我的脚本中实现网络连接检查,以便在没有连接时暂停/重试循环的迭代,并且只有在有连接时才重新启动?

4

5 回答 5

5

可能有一个更优雅的解决方案,但我会这样做:

require 'open-uri'

def internet_connectivity?
  open('http://google.com')
  true
rescue => ex
  false
end
于 2013-05-14T20:56:51.647 回答
2

好吧,在 Python 中,我用 try except 块做了类似的事情,如下所示:

import requests

try:
    response = requests.get(URL)
except Exception as e:
    print "Something went wrong:"
    print e

这只是您可以做的一个示例,您可以检查 error_code 或有关异常的一些信息,并据此定义要做什么。当请求出现问题时,我通常让脚本休眠 10 分钟。

import time
time.sleep(600)
于 2013-05-14T20:56:10.177 回答
1

here's a unix-specific solution:

In [18]: import subprocess

In [19]: subprocess.call(['/bin/ping', '-c1', 'blahblahblah.com'])

Out[19]: 1

In [20]: subprocess.call(['/bin/ping', '-c1', 'google.com'])

Out[20]: 0

ie, ping will return 0 if the ping is successful

于 2013-05-14T21:01:54.990 回答
0

在 Python 中,您可以执行以下操作:

def get_with_retry(url, tries=5, wait=1, backoff=2, ceil=60):
    while True:
        try:
            return requests.get(url)
        except requests.exceptions.ConnectionError:
            tries -= 1
            if not tries:
                raise
            time.sleep(wait)
            wait = min(ceil, wait * backoff)

这会尝试每个请求tries多次,最初wait在尝试之间延迟几秒钟,但backoff每次尝试将延迟增加一倍,最多可达ceil几秒钟。(默认值意味着它将等待 1 秒,然后是 2 秒,然后是 4 秒,然后是 8 秒,然后失败。)通过设置这些值,您可以设置等待网络恢复的最长时间,然后您的主程序不得不担心它。对于无限重试,请使用负值,tries因为减去 1 永远不会达到 0。

在某些时候,您希望程序告诉您它是否无法上网,您可以通过将整个程序包装在try/中来做到这一点,如果发生except,它会以某种方式通知您。ConnectionError

于 2021-11-16T18:06:26.960 回答
0

内联方式:

require 'open-uri'

def internet_access?; begin open('http://google.com'); true; rescue => e; false; end; end

puts internet_access?

于 2021-11-16T17:52:22.357 回答