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相同的同步风格体验
Nice
这个问题挺有意思的。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 说服了。
看到 curio 的作者推了你的包。
https://twitter.com/dabeaz/status/924756107117125632
惊喜,哈哈
很好用的样子

