【问题标题】:Python & URLLIB2 - Request webpage but don't wait for responsePython & URLLIB2 - 请求网页但不等待响应
【发布时间】:2013-12-14 07:41:46
【问题描述】:

在 python 中,我将如何进行 http 请求但不等待响应。我不关心取回任何数据,我只需要服务器注册一个页面请求。

现在我使用这个代码:

urllib2.urlopen("COOL WEBSITE")

但显然这会暂停脚本,直到返回响应,我只想触发请求并继续。

我该怎么做?

【问题讨论】:

  • 作为未来的提示:请将所需的 python 版本(例如 python-2.7python-3.x)添加到标志中,以便我们知道您请求的 python 版本(这些版本之间存在多个差异)

标签: python urllib2


【解决方案1】:

你想要的在这里被称为 ThreadingAsynchronous

线程

  • 将对urllib2.urlopen() 的调用封装在threading.Thread()

例子:

from threading import Thread

def open_website(url):
    return urllib2.urlopen(url)

Thread(target=open_website, args=["http://google.com"]).start()

异步:

  • 很遗憾,Python 标准库中没有执行此操作的标准方法。

使用具有此支持的requests 库。

例子:

from requests import async

async.get("http://google.com")

还有第三个选项使用restclient 库,它有 内置(有一段时间异步支持:

from restclient import GET

res = GET("http://google.com", async=True, resp=True)

【讨论】:

  • 为了将来参考,requests.async 已被删除以支持grequests
【解决方案2】:

使用线程:

import threading

threading.Thread(target=urllib.urlopen, args=('COOL WEBSITE',)).start()

不要忘记args 参数应该是元组。这就是为什么后面有,

【讨论】:

  • 使用 Python 标准库的简单单行代码,没有额外的功能 - 我喜欢这个!
【解决方案3】:

您可以使用 requests 库执行此操作,如下所示

import requests
try:
    requests.get("http://127.0.0.1:8000/test/",timeout=10)
except requests.exceptions.ReadTimeout: #this confirms you that the request has reached server
    do_something
except:
    print "unable to reach server"
    raise

从上面的代码中,您可以发送异步请求而不会得到响应。根据您的需要指定超时。如果没有,它不会超时。

【讨论】:

  • 这不是异步请求。这只是一个超时的请求。
  • 是的,但是请求中没有异步选项,所以我想出了这个技巧。这就是为什么我使用死超时异常来确认。如果我们使用答案之一中提到的线程,程序可能会结束,但线程仍可能等待响应。
【解决方案4】:

gevent 可能是一个合适的选择。

第一个补丁插座:

import gevent
import gevent.monkey
monkey.patch_socket()
monkey.patch_ssl()

然后使用gevent.spawn() 封装您的请求以生成greenlets。不会阻塞主线程,速度非常快!

这是一个简单的tutorial

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2011-01-12
    • 2015-01-06
    相关资源
    最近更新 更多