我建立了一个视图(使用web2py)和一些其他网站的数据(大约10个),所以,对于我创建的每个网站的功能,它准备一些参数,用参数发送请求,得到响应并做一些处理,在这之后,我将响应传递给控制器,它将构建包含所有10个请求响应的视图完成后。在
我的问题与速度有关,因为HTTP协议的性质,所有请求都是同步的,当服务器需要很长时间响应时,我的应用程序会一直等待。我想知道是否有任何方法可以“并行化”我的函数调用,这样我就可以在等待其他服务器的响应时执行其他操作。在
我已经检查了grequests和request futures,但我认为这不太适合这种情况,因为我不只是提出请求,我会像前面所说的那样对请求进行一些前后处理。在
寻求解决方案,如
grequest
。在原因是大多数时候,您等待工作I/O操作完成(下载页面)。很有可能,与这个I/O时间相比,前处理和后处理实际上是微不足道的。在
我看到过很多关于网页抓取的
grequest
的加速。在如果您的前处理和后处理也很耗时,那么您将不得不使用
multiprocessing
模块,并在多个进程中运行任务(如果您是CPU受限的,那么多个线程是没有帮助的)。在但首先-真的要试试
grequest
。在使用grequests的HTTP作业
由于需要进行一些预处理和后处理,所以我们必须以某种方式对其进行组织。在
grequests:“未发送请求”的概念
grequests
有一个“未发送请求”的概念。这是以后要做的工作。grequests
允许启动这些作业,例如通过grequests.map
或grequests.imap
。在grequests:对未发送的请求进行回调(hooks)
每个未发送的请求都可以有附加的钩子来处理返回的响应。在
一个未发送的请求可以附加更多的钩子。在
我们将使用它进行后处理。在
类HttpJobXxx绑定每个实例的东西
我们希望以某种方式组织好以下与工作相关的事情:
我们稍后将在以下步骤中使用它:
post_process
调用的后处理最终响应。在grequests.map
或grequests.imap
运行。在诀窍在于,每个作业实例都可以利用其自己的参数来保持 上下文信息在整个作业生命周期中保持干净。在
HttpJobMyIp
这是真实的代码:
HttpJobDelay
为了使示例完整,我们可以添加另一个HTTP作业类。这次允许调用一个url, 它会延迟响应。在
^{pr2}$在这里我们故意修改延迟,增加0.7秒显示,预处理有一个 改变某事的机会。在
让一切都过去吧
计划是调用
HttpJobMyIp
作业的一个实例和HttpJobDelay
作业的4个实例 不同的请求延迟。延误是故意不分类的。在在
mreq.py
文件中包含以上所有代码,我们可以运行它:经验教训
在哪里可以找到
grequests
文档没有ReadTheDocs文档。在
而是使用:
注意,
HttpJobXxx
类不是必需的,创建它只是因为我觉得它很方便。在回调函数参数:include
**kwargs
回调函数应有两个参数:
response
(由HTTP调用提供)**kwargs
如果没有
**kwargs
,代码将静默不动。在静默失败:使用异常处理程序
在没有异常处理程序的情况下,如果出现问题,您通常会不知道是什么 继续。使用
exception_handler
你可以得到一个异常作为结果,并了解到,发生了什么 错了。在退出太快:
grequests.imap
是生成器立即调用
grequests.imap(http_jobs, exception_handler=exception_handler), size=6)
返回生成器,如果没有任何内容消耗其中的值,则继续并退出。在因此,调用被封装在
list()
中。在并发处理的请求-有效
如我们所见,不管
HttpJobDelay
的延迟实例未排序,则返回结果 按顺序-最短的延迟在前,较长的延迟在后。使用grequests.imap
的 未发送请求的顺序和结果的顺序可能不同。在另一方面,使用
grequests.map
时,结果将按原来的顺序返回 按工作列表请求。在grequest.imap
参数size
默认为2如果不指定
size
,它将使用默认值2。这可能会影响结果的顺序。在期待什么样的加速
grequests
使用“绿色线程”在一个进程中运行。这意味着,在不同的 “绿色线程”效率更高,因为它是在代码喜欢的时候执行的,因此可以节省 CPU和操作系统进行上下文切换的开销。在由于任务是I/O受限的(大多数时间我们都在等待一些数据的到来),所以我们可以很好地生活在其中 单一流程。在
当请求数增加时,将看到最高的加速。在
相关问题 更多 >
编程相关推荐