内容简介:Clojure 并发实践:使用 pmap 加速程序
LeanCloud 的控制台会展示一个应用列表,应用列表会展示该用户的所有应用,以及每个应用的基本信息,例如总用户数、昨天请求量和本月请求量等。我们最多允许每个用户创建 50 个应用。伪代码大概是这样:
(defn add-app-info
"添加应用统计信息。"
[app]
(assoc app
:yesterday_reqs (count-reqs app 7)
:monthly_reqs (count-reqs app 30)
:total_users (count-users app)))
(defn get-client-apps
"获取用户的应用列表"
[client_id]
(->> client_id
(db/find-apps-by-client-id)
(map add-app-info)))
显然,这里每个应用为了获取这些请求信息,都至少要请求三次。虽然这些统计请求本身已经有了缓存,但是假设有 50 个应用(实际中,部分开发者的应用数量包括协作应用在内会更多),那就需要发起 150 个请求,这个过程如果完全串行处理的话,假设 add-app-info 的开销至少是 1~3 毫秒,串行处理下来也需要 50~150 毫秒,加上传输的时间,那么用户的体验的就相当差了。
这时候,我们可以用并发处理来加速了,你只需要替换一个函数,将 get-client-apps
的 map
替换为 pmap
即可:
(defn get-client-apps
"获取用户的应用列表"
[client_id]
(->> client_id
(db/find-apps-by-client-id)
(pmap add-app-info)))
关于 pmap
的讨论参见 并发函数pmap、pvalues和pcalls
。因为 pmap
对于 chunked sequnce 的处理是批量处理,因此最多同时使用 32 个并发任务在处理,这个线程数量在这个场景下是可以接受的。加速后的性能也可以估算出来 (Math/round (/ n 32.0)) x (1~3)
毫秒。 在实际线上环境中,大概加速了 3~4 倍左右。
在测量性能的时候,注意使用 doall,因为 clojure 的 LazySeq 特性会干扰你的测试。
一个函数替换就能获得并发加速,抽象的力量在这里体现的淋漓尽致。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
软件预构艺术(中文版)
Ken Pugh / O'Reilly Taiwan公司 / 东南大学 / 2010-6 / 26.00元
利用经验累积而得到的洞察力开发新的解决方案被称为预构。透过重构而获得的专业知识也属于这类经验,而预构的词源即重构。重构是修改程序或软件系统内部结构的实践,以此在保留其现有行为的基础上改良设计。重构的原因有多种:方便后期增加功能、提高可维护性、提升性能。 本书作者是经验老道的软件开发人员。书中,作者运用他个人和其他众多开发人员的丰富经验,展示由其推衍而得的各项实践方针。这些方针把优秀的开发人员......一起来看看 《软件预构艺术(中文版)》 这本书的介绍吧!