python - 如何启用请求异步模式?

标签 python asynchronous urllib2 gevent python-requests

对于此代码:

import sys

import gevent
from gevent import monkey

monkey.patch_all()

import requests
import urllib2

def worker(url, use_urllib2=False):
    if use_urllib2:
        content = urllib2.urlopen(url).read().lower()
    else:
        content = requests.get(url, prefetch=True).content.lower()
    title = content.split('<title>')[1].split('</title>')[0].strip()

urls = ['http://www.mail.ru']*5

def by_requests():
    jobs = [gevent.spawn(worker, url) for url in urls]
    gevent.joinall(jobs)

def by_urllib2():
    jobs = [gevent.spawn(worker, url, True) for url in urls]
    gevent.joinall(jobs)

if __name__=='__main__':
    from timeit import Timer
    t = Timer(stmt="by_requests()", setup="from __main__ import by_requests")  
    print 'by requests: %s seconds'%t.timeit(number=3)
    t = Timer(stmt="by_urllib2()", setup="from __main__ import by_urllib2")  
    print 'by urllib2: %s seconds'%t.timeit(number=3)
    sys.exit(0)

这个结果:

by requests: 18.3397213892 seconds
by urllib2: 2.48605842363 seconds

在嗅探器中它看起来是这样的:

描述:前 5 个请求由 requests 库发送,接下来的 5 个请求由 urllib2 库发送。 红色 - 工作被卡住的时间,黑暗 - 接收数据时...... wtf?!

如果套接字库已修补并且库必须以相同的方式工作,怎么可能? 如何在没有 requests.async 的情况下使用 requests 进行异步工作?

最佳答案

对不起,肯尼斯·赖茨。他的图书馆很棒。

我很傻。我需要像这样为 httplib 选择猴子补丁:

gevent.monkey.patch_all(httplib=True)

因为 httplib 的补丁默认是禁用的。

关于python - 如何启用请求异步模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9501663/

相关文章:

python - 当 'putting' 实体时检测实体的特定属性是否已被更改?

asynchronous - 如何限制传递给 Async.Parallel 的大量异步工作流

android - 如果调用它的 Activity 已完成,如何检查(Android)异步任务?

python - 将表单数据发送到aspx页面

python - 使用 urllib2 和 simplejson 无限循环

python - 错误 : [Errno -2] Name or service not known

python - 斐波那契错误: maximum recursion depth exceeded in comparison

python - 从类变量调用方法/函数

python - 源代码字符串不能包含空字节

c# - 异步等待死锁