Clojure 中代理(Agents)的应用与并行工作负载优化
在并发编程中,Clojure 的代理(Agents)是一种强大的工具,它可以帮助我们简化 I/O 操作的协调,并行化复杂的工作负载。本文将通过具体的示例,详细介绍代理在游戏状态持久化和网页爬虫并行化中的应用。
1. 代理动作的执行与状态变更
在 Clojure 中,代理动作(agent action),如嵌套发送(nested send),会一直保持到动作完成。在动作评估或软件事务内存(STM)事务完成之前,发送的动作可能会被保留。如果验证器中止了与动作评估或 STM 事务相关的状态更改,这些待处理的动作可能会被完全丢弃。
2. 使用基于代理的写后日志持久化引用状态
在一些使用引用(refs)来维护角色状态的游戏中,特别是支持多人游戏的场景,需要跟踪和存储玩家活动及其对角色的影响。但我们不希望将日志记录、持久化或其他 I/O 操作直接放入核心游戏引擎中,因为事务重启可能会导致持久化操作不一致。
解决这个问题的简单方法是使用监视器(watchers)和代理来实现游戏角色的写后日志。具体步骤如下:
1. 设置代理 :创建包含输出接收器的代理,这里假设代理包含 java.io.Writers 。
(require '[clojure.java.io :as io])
(def console (agent *out*))
(def character-log (agent (io/writer "character-states.l
超级会员免费看
订阅专栏 解锁全文
的应用与并行工作负载优化&spm=1001.2101.3001.5002&articleId=150460748&d=1&t=3&u=bee09492723348a8bd1988e4cfb09243)
347

被折叠的 条评论
为什么被折叠?



