什么导致python套接字超时

什么导致python套接字超时,python,sockets,python-3.x,urllib,Python,Sockets,Python 3.x,Urllib,我有一个在Linux(Raspbian)上运行的简单Python代码,并使用urlopen(基本上这是使用Pythonsocket)连接到服务器: 从 timeout=None将在blocking模式下运行这不是我想要的,因为如果我没有internet连接,它将永远挂起 timeout=0将在非阻塞模式下运行,但使用它,我会得到错误115(操作正在进行) timeout=20将在timeout模式下运行,阻塞20秒,如果无法创建连接则转义 我的问题是: 为什么非阻塞模式总是失败?(这可能是一

我有一个在Linux(Raspbian)上运行的简单Python代码,并使用
urlopen
(基本上这是使用Python
socket
)连接到服务器:

  • timeout=None
    将在
    blocking
    模式下运行这不是我想要的,因为如果我没有internet连接,它将永远挂起
  • timeout=0
    将在
    非阻塞
    模式下运行,但使用它,我会得到错误115(操作正在进行)
  • timeout=20
    将在
    timeout
    模式下运行,阻塞20秒,如果无法创建连接则转义
我的问题是:

  • 为什么
    非阻塞
    模式总是失败?(这可能是一种误解,但我认为它有时应该有效,而不是总是失败)
  • 有时是什么导致20秒超时?(80%的情况下,
    urlopen
    将在1-2秒内执行,20%超时)

  • 不阻止联系远程站点?我想说,这注定会失败。你自己说过,该网站有时需要20秒以上才能回复。@Jean-Françoisfare我不知道该网站是否是延迟的原因。我怎样才能证实这个假设呢?我想说,连接打开时不阻塞是不现实的。例如,如果您正在读取一个消息队列,而该队列中已经发布了一条消息,则非阻塞是有效的。但是如果它是空的,它会立即退出。我理解你的立场,但是:为什么网站不立即接受连接?为什么有时候需要20秒?这正常/现实吗?与问题没有严格的关系,但您确实不应该使用
    try/bare,除非使用
    ,尤其是在调试时(但实际上在任何生产代码中)。通过使用bare,除非您丢弃了解释器提供的所有信息,这些信息可能有助于调试…无阻塞地联系远程站点?我想说,这注定会失败。你自己说过,该网站有时需要20秒以上才能回复。@Jean-Françoisfare我不知道该网站是否是延迟的原因。我怎样才能证实这个假设呢?我想说,连接打开时不阻塞是不现实的。例如,如果您正在读取一个消息队列,而该队列中已经发布了一条消息,则非阻塞是有效的。但是如果它是空的,它会立即退出。我理解你的立场,但是:为什么网站不立即接受连接?为什么有时候需要20秒?这正常/现实吗?与问题没有严格的关系,但您确实不应该使用
    try/bare,除非使用
    ,尤其是在调试时(但实际上在任何生产代码中)。通过使用bare except,您丢弃了解释器提供的可能有助于调试的所有信息。。。
    
     req = urllib.request.Request('myServer', data = params, headers = head)
     try:
        response = urllib.request.urlopen(req, timeout = 20)
     except: