【发布时间】:2017-11-02 13:51:59
【问题描述】:
在 Clojure 中,当处理的每个作业都可以完全孤立地发生并且可能生成需要评估的其他作业列表时,在 Clojure 中进行并行处理的正确方法是什么?
我的实际问题是营养计算问题,但我将把它放在 Chess 的形式中,它与我的计算具有相同的问题空间特征。
假设,例如,我试图在国际象棋游戏中找到将棋的所有动作。在搜索棋盘状态时,我会从 20 个可能的状态开始,每个状态代表不同的可能开局动作。每一个都需要被评估、接受或拒绝,然后对于每个被接受的动作,将创建一个新的工作列表,代表所有可能的下一步动作。作业如下所示:
initial: '([] proposed-move)
accepted: '([move] proposed-response)
'([move move] proposed-response)
每次计算的结果是要评估的状态数量会增加,并且每个状态都可以在与所有其他状态完全隔离的情况下进行评估。
我正在使用的解决方案是这样的:
; a list of all final solutions, each of which is a sequence of moves
(def solutions (agent []))
; a list of all jobs pending evaluation
(def jobs (agent []))
鉴于这些定义,我将拥有一个 java 线程池,每个线程都会从作业代理请求一个作业(并等待该请求得到满足)。然后它将运行计算,生成解决方案列表和可能的解决方案。最后,它将解决方案发送给解决方案代理,并将可能的解决方案发送给工作代理。
在这种情况下,使用代理和线程的组合是最惯用的方法吗?我什至可以按照我提议的方式从作业队列中取出数据吗?
或者我的作业应该是 java.util.concurrent.LinkedBlockingQueue,如 Producer consumer with qualifications 中所述?
【问题讨论】:
-
或者,也许是一堆future而不是线程池?
-
这看起来像是一个非常有状态的实现。我建议以更实用的方式来做,并依靠核心功能来解决并发问题
-
这是一个图搜索问题,不是 clojure 问题;你掩盖了最重要的部分。一旦你决定了搜索算法、启发式等,然后回来询问如何在 clojure 中实现它。
标签: clojure parallel-processing