首页 文章

在单个线程中使用带有Python的阻塞http库的并发http请求

提问于
浏览
0

所以我有这个问题,我试图以一种特殊的方式解决,但我不确定它有多难实现 .

我想使用Python 3.4的asyncio / coroutines功能来触发许多并发的http请求,使用阻塞的http库,比如请求,或任何执行http请求的Python api,如boto for aws .

我知道run_in_executor()方法在线程/进程中运行任务,但我想避免这种情况 .

我想在单线程中使用Linux / Unix内核中的那些选择功能来完成它 .

实际上我正在关注David Beazley对此的介绍,我试图使用这段代码:https://github.com/dabeaz/concurrencylive/blob/master/aserver.py

但是没有未来/池的东西,并使用我的blocking-api调用而不是计算Fibonacci数 .

看来http请求仍在按顺序运行 .

任何想法,如果这是可能的?如何?

谢谢

1 回答

  • 3

    不可能 . requests 库对底层套接字的所有调用都是阻塞的(即 socket.read ),因为套接字处于阻塞模式 . 您可以将套接字置于非阻塞模式,但是 socket.read 将失败 . 你基本上需要一个事件循环来告诉你什么时候可以做 socket.read ,但是阻塞库不是为了记住 . 这就是 asyncio 存在的全部原因;提供一个默认的事件循环,不同的库可以共享和使用非阻塞文件描述符(例如套接字) .

    使用 aiohttp ,它就像 requests 一样简单,并且在此过程中您可以了解有关 asyncio 的更多信息 . asyncio 和新的Python 3.5 async/await 语法是网络IO的未来;屈服于它(双关语) .

相关问题