跳转到主要内容

gevent的HTTP客户端库

项目描述

GitHub Workflow CI Status PyPI Python Version from PEP 621 TOML PyPI - Downloads

geventhttpclient

一个使用gevent的高性能、并发HTTP客户端库,适用于Python。

gevent.httplibhttp.client的补丁支持在gevent 1.0版本中被移除,geventhttpclient现在提供了缺失的功能。

geventhttpclient使用一个快速的http解析器,用C语言编写。

geventhttpclient专为高并发、流式传输和HTTP 1.1持久连接支持而设计。更普遍地说,它是为高效地从REST API和像Twitter这样的流式API中提取数据而设计的。

默认提供安全SSL支持。geventhttpclient依赖于certifi CA Bundle。这与随Requests代码库一起提供的CA Bundle相同,并源自Mozilla Firefox的规范集。

从版本2.3开始,geventhttpclient拥有一个与requests高度兼容的接口。它涵盖了基本的HTTP使用,包括cookie管理、表单数据编码或解码压缩数据,但与原始的requests相比,功能并不丰富。对于简单的用例,它可以作为一个直接替换。

import geventhttpclient as requests
requests.get("https://github.com").text
requests.post("http://httpbingo.org/post", data="asdfasd").json()

from geventhttpclient import Session
s = Session()
s.get("http://httpbingo.org/headers").json()
s.get("https://github.com").content

此接口建立在低级别的HTTPClient之上。

from geventhttpclient import HTTPClient
from geventhttpclient.url import URL

url = URL("http://gevent.org/")
client = HTTPClient(url.host)
response = client.get(url.request_uri)
response.status_code
body = response.read()
client.close()

httplib兼容性和猴子补丁

geventhttpclient.httplib模块包含用于替换http.client连接和响应对象的类。如果您直接使用http.client,可以将httplib导入替换为geventhttpclient.httplib

# from http.client import HTTPConnection
from geventhttpclient.httplib import HTTPConnection

如果您使用httplib2urlliburllib2,您可以将httplib补丁为使用来自geventhttpclient的包装器。对于httplib2,请确保在导入之前进行补丁,否则super()调用将失败。

import geventhttpclient.httplib
geventhttpclient.httplib.patch()

import httplib2

高并发

HTTPClient内置了连接池,并且设计上对greenlet安全。您可以在多个greenlet之间使用相同的实例。它是此库的低级别构建块。

import gevent.pool
import json

from geventhttpclient import HTTPClient
from geventhttpclient.url import URL


# go to http://developers.facebook.com/tools/explorer and copy the access token
TOKEN = "<MY_DEV_TOKEN>"

url = URL("https://graph.facebook.com/me/friends", params={"access_token": TOKEN})

# setting the concurrency to 10 allow to create 10 connections and
# reuse them.
client = HTTPClient.from_url(url, concurrency=10)

response = client.get(url.request_uri)
assert response.status_code == 200

# response comply to the read protocol. It passes the stream to
# the json parser as it's being read.
data = json.load(response)["data"]

def print_friend_username(client, friend_id):
    friend_url = URL(f"/{friend_id}", params={"access_token": TOKEN})
    # the greenlet will block until a connection is available
    response = client.get(friend_url.request_uri)
    assert response.status_code == 200
    friend = json.load(response)
    if "username" in friend:
        print(f"{friend['username']}: {friend['name']}")
    else:
        print(f"{friend['name']} has no username.")

# allow to run 20 greenlet at a time, this is more than concurrency
# of the http client but isn't a problem since the client has its own
# connection pool.
pool = gevent.pool.Pool(20)
for item in data:
    friend_id = item["id"]
    pool.spawn(print_friend_username, client, friend_id)

pool.join()
client.close()

流式传输

geventhttpclient支持流式传输。响应对象具有read(n)readline()方法,可以增量地读取流。请参阅examples/twitter_streaming.py以获取拉取Twitter流API的示例。

以下是一个示例,说明如何分块下载大文件以节省内存

from geventhttpclient import HTTPClient, URL

url = URL("http://127.0.0.1:80/100.dat")
client = HTTPClient.from_url(url)
response = client.get(url.query_string)
assert response.status_code == 200

CHUNK_SIZE = 1024 * 16 # 16KB
with open("/tmp/100.dat", "w") as f:
    data = response.read(CHUNK_SIZE)
    while data:
        f.write(data)
        data = response.read(CHUNK_SIZE)

基准测试

基准测试在默认配置下对本地nginx服务器运行了10000个GET请求,并发为10。请参阅benchmarks文件夹。以下表格中给出了几个流行客户端的每秒请求数。请阅读benchmarks/README.md以获取更多详细信息。另外,请注意,HTTPX最好与asyncio一起使用,而不是gevent

HTTP客户端 RPS
GeventHTTPClient 7268.9
Httplib2 (patched) 2323.9
Urllib3 2242.5
Requests 1046.1
Httpx 770.3

Linux(x86_64), Python 3.11.6 @ Intel i7-7560U

许可证

本软件包采用MIT许可证分发。之前版本的geventhttpclient使用了http_parser.c,该文件基于来自NGINXhttp/ngx_http_parse.c,版权为Igor Sysoev、Joyent, Inc.和其他Node贡献者。有关更多信息,请参阅http://github.com/joyent/http-parser

项目详情


发布历史 发布通知 | RSS源

下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分发

geventhttpclient-2.3.1.tar.gz (69.3 kB 查看哈希值)

上传时间 源代码

构建分发

geventhttpclient-2.3.1-pp310-pypy310_pp73-win_amd64.whl (48.3 kB 查看哈希值)

上传时间 PyPy Windows x86-64

geventhttpclient-2.3.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (54.0 kB 查看哈希值)

上传时间 PyPy manylinux: glibc 2.17+ ARM64

geventhttpclient-2.3.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (54.3 kB 查看哈希值)

上传时间 PyPy manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

geventhttpclient-2.3.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (58.4 kB 查看哈希值)

上传时间 PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

geventhttpclient-2.3.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl (49.8 kB 查看哈希)

上传时间 PyPy macOS 10.9+ x86-64

geventhttpclient-2.3.1-pp39-pypy39_pp73-win_amd64.whl (48.3 kB 查看哈希)

上传时间 PyPy Windows x86-64

geventhttpclient-2.3.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (54.0 kB 查看哈希)

上传时间 PyPy manylinux: glibc 2.17+ ARM64

geventhttpclient-2.3.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (54.3 kB 查看哈希)

上传时间 PyPy manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

geventhttpclient-2.3.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (58.4 kB 查看哈希)

上传时间 PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

geventhttpclient-2.3.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (49.8 kB 查看哈希)

上传时间 PyPy macOS 10.9+ x86-64

geventhttpclient-2.3.1-cp312-cp312-win_amd64.whl (48.3 kB 查看哈希)

上传时间 CPython 3.12 Windows x86-64

geventhttpclient-2.3.1-cp312-cp312-win32.whl (47.6 kB 查看哈希)

上传时间 CPython 3.12 Windows x86

geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_x86_64.whl (117.8 kB 查看哈希)

上传时间 CPython 3.12 musllinux: musl 1.1+ x86-64

geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_ppc64le.whl (128.2 kB 查看哈希)

上传于 CPython 3.12 musllinux: musl 1.1+ ppc64le

geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_i686.whl (118.9 kB 查看哈希)

上传于 CPython 3.12 musllinux: musl 1.1+ i686

geventhttpclient-2.3.1-cp312-cp312-musllinux_1_1_aarch64.whl (122.0 kB 查看哈希)

上传于 CPython 3.12 musllinux: musl 1.1+ ARM64

geventhttpclient-2.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (124.1 kB 查看哈希)

上传于 CPython 3.12 manylinux: glibc 2.17+ ppc64le

geventhttpclient-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (118.5 kB 查看哈希)

上传于 CPython 3.12 manylinux: glibc 2.17+ ARM64

geventhttpclient-2.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (113.8 kB 查看哈希)

上传于 CPython 3.12 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

geventhttpclient-2.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (115.1 kB 查看哈希)

上传于 CPython 3.12 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

geventhttpclient-2.3.1-cp312-cp312-macosx_11_0_arm64.whl (51.6 kB 查看哈希)

上传于 CPython 3.12 macOS 11.0+ ARM64

geventhttpclient-2.3.1-cp312-cp312-macosx_10_9_x86_64.whl (52.1 kB 查看哈希)

上传于 CPython 3.12 macOS 10.9+ x86-64

geventhttpclient-2.3.1-cp312-cp312-macosx_10_9_universal2.whl (71.7 kB 查看哈希)

上传于 CPython 3.12 macOS 10.9+ universal2 (ARM64, x86-64)

geventhttpclient-2.3.1-cp311-cp311-win_amd64.whl (48.3 kB 查看哈希值)

上传时间: CPython 3.11 Windows x86-64

geventhttpclient-2.3.1-cp311-cp311-win32.whl (47.6 kB 查看哈希值)

上传时间: CPython 3.11 Windows x86

geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_x86_64.whl (117.3 kB 查看哈希值)

上传时间: CPython 3.11 musllinux: musl 1.1+ x86-64

geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_ppc64le.whl (128.1 kB 查看哈希值)

上传时间: CPython 3.11 musllinux: musl 1.1+ ppc64le

geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_i686.whl (118.8 kB 查看哈希值)

上传时间: CPython 3.11 musllinux: musl 1.1+ i686

geventhttpclient-2.3.1-cp311-cp311-musllinux_1_1_aarch64.whl (122.0 kB 查看哈希值)

上传时间: CPython 3.11 musllinux: musl 1.1+ ARM64

geventhttpclient-2.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (123.4 kB 查看哈希值)

上传时间: CPython 3.11 manylinux: glibc 2.17+ ppc64le

geventhttpclient-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (118.0 kB 查看哈希值)

上传时间: CPython 3.11 manylinux: glibc 2.17+ ARM64

geventhttpclient-2.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (112.8 kB 查看哈希值)

上传时间: CPython 3.11 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

geventhttpclient-2.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (114.5 kB 查看哈希值)

上传时间: CPython 3.11 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

geventhttpclient-2.3.1-cp311-cp311-macosx_11_0_arm64.whl (51.6 kB 查看哈希值)

上传时间: CPython 3.11 macOS 11.0+ ARM64

geventhttpclient-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl (52.1 kB 查看哈希值)

上传时间: CPython 3.11 macOS 10.9+ x86-64

geventhttpclient-2.3.1-cp311-cp311-macosx_10_9_universal2.whl (71.7 kB 查看哈希值)

上传时间: CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

geventhttpclient-2.3.1-cp310-cp310-win_amd64.whl (48.3 kB 查看哈希值)

上传时间: CPython 3.10 Windows x86-64

geventhttpclient-2.3.1-cp310-cp310-win32.whl (47.6 kB 查看哈希值)

上传时间: CPython 3.10 Windows x86

geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_x86_64.whl (116.4 kB 查看哈希值)

上传时间: CPython 3.10 musllinux: musl 1.1+ x86-64

geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl (127.3 kB 查看哈希值)

上传时间: CPython 3.10 musllinux: musl 1.1+ ppc64le

geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_i686.whl (117.9 kB 查看哈希值)

上传时间: CPython 3.10 musllinux: musl 1.1+ i686

geventhttpclient-2.3.1-cp310-cp310-musllinux_1_1_aarch64.whl (121.2 kB 查看哈希值)

上传时间: CPython 3.10 musllinux: musl 1.1+ ARM64

geventhttpclient-2.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (123.3 kB 查看哈希值)

上传时间: CPython 3.10 manylinux: glibc 2.17+ ppc64le

geventhttpclient-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (117.8 kB 查看哈希值)

上传时间: CPython 3.10 manylinux: glibc 2.17+ ARM64

geventhttpclient-2.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (112.7 kB 查看哈希值)

上传时间: CPython 3.10 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

geventhttpclient-2.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (114.3 kB 查看哈希值)

上传时间: CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

geventhttpclient-2.3.1-cp310-cp310-macosx_11_0_arm64.whl (51.6 kB 查看哈希值)

上传时间: CPython 3.10 macOS 11.0+ ARM64

geventhttpclient-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl (52.1 kB 查看哈希值)

上传时间: CPython 3.10 macOS 10.9+ x86-64

geventhttpclient-2.3.1-cp310-cp310-macosx_10_9_universal2.whl (71.7 kB 查看哈希值)

上传时间: CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

geventhttpclient-2.3.1-cp39-cp39-win_amd64.whl (48.3 kB 查看哈希值)

上传时间: CPython 3.9 Windows x86-64

geventhttpclient-2.3.1-cp39-cp39-win32.whl (47.6 kB 查看哈希值)

上传时间: CPython 3.9 Windows x86

geventhttpclient-2.3.1-cp39-cp39-musllinux_1_1_x86_64.whl (116.2 kB 查看哈希值)

上传时间: CPython 3.9 musllinux: musl 1.1+ x86-64

geventhttpclient-2.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl (127.0 kB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.1+ ppc64le

geventhttpclient-2.3.1-cp39-cp39-musllinux_1_1_i686.whl (117.6 kB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.1+ i686

geventhttpclient-2.3.1-cp39-cp39-musllinux_1_1_aarch64.whl (121.0 kB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.1+ ARM64

geventhttpclient-2.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (123.1 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ ppc64le

geventhttpclient-2.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (117.6 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ ARM64

geventhttpclient-2.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (112.5 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

geventhttpclient-2.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (114.1 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

geventhttpclient-2.3.1-cp39-cp39-macosx_11_0_arm64.whl (51.6 kB 查看哈希值)

上传于 CPython 3.9 macOS 11.0+ ARM64

geventhttpclient-2.3.1-cp39-cp39-macosx_10_9_x86_64.whl (52.0 kB 查看哈希值)

上传于 CPython 3.9 macOS 10.9+ x86-64

geventhttpclient-2.3.1-cp39-cp39-macosx_10_9_universal2.whl (71.7 kB 查看哈希值)

上传于 CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

由以下支持