Python异步HTTP库Curio + Requests:如何实现与Requests相同的同步风格体验

$ pip install curequests

from curio import run
from curequests import get, post

async def main(): r = await get(‘https://httpbin.org/get’) print(r.json()) r = await post(‘https://httpbin.org/post’, json={‘hello’: ‘world’}) print(r.json())

run(main)

和 Requests 一样的味道,请参考 Requests 文档 食用!
Github: https://github.com/guyskk/curequests


Python异步HTTP库Curio + Requests:如何实现与Requests相同的同步风格体验

10 回复

这个问题挺有意思的。Curio本身是异步框架,但你想用同步风格来写代码,其实可以用curio.run()配合requests库来实现。

不过要注意,requests本身是同步库,在Curio里直接调用会阻塞事件循环。你需要用curio.run_in_thread()来包装它:

import curio
import requests

async def fetch_url(url):
    # 在单独的线程中运行requests请求
    response = await curio.run_in_thread(lambda: requests.get(url))
    return response.text

# 同步风格的调用方式
def main():
    result = curio.run(fetch_url, 'https://httpbin.org/get')
    print(result)

if __name__ == '__main__':
    main()

如果你想要更简洁的写法,可以封装一个辅助函数:

import curio
import requests

def sync_requests():
    """让requests在Curio中以同步风格运行"""
    def decorator(func):
        async def wrapper(*args, **kwargs):
            return await curio.run_in_thread(lambda: func(*args, **kwargs))
        return wrapper
    return decorator

# 使用装饰器
@sync_requests()
def get_request(url):
    return requests.get(url).json()

# 现在可以这样调用
async def main():
    data = await get_request('https://httpbin.org/get')
    print(data)

# 同步入口
if __name__ == '__main__':
    curio.run(main)

不过说实话,如果你主要用requests并且想要同步风格,可能直接用requests本身更简单。Curio的优势在于异步IO,强行用同步风格有点绕。

总结:用curio.run_in_thread()包装同步调用。

#2 asyncio 太复杂了,curio + requests 学习成本接近 0,并且 API 非常好用

果然不支持 Python 2,现在生产环境还是 Python 2 + Tornado httpclient,
相比 requests 还是蛮难用的

又是你,这个偏爱 curio 的家伙

我也是

curio 确实比较好用,我被 beazley 说服了。

惊喜,哈哈

很好用的样子

回到顶部