Multithreading Clojure:创建和管理多个线程
我写了一个程序,需要处理一个非常大的数据集,我计划在一台高端机器上用多个线程运行它 我是Clojure的初学者,我迷失在可供使用的无数工具中- 代理、期货、core.async(和石英岩?)。我想知道哪一个最适合这份工作 以下是我的情况:Multithreading Clojure:创建和管理多个线程,multithreading,clojure,Multithreading,Clojure,我写了一个程序,需要处理一个非常大的数据集,我计划在一台高端机器上用多个线程运行它 我是Clojure的初学者,我迷失在可供使用的无数工具中- 代理、期货、core.async(和石英岩?)。我想知道哪一个最适合这份工作 以下是我的情况: 我有一个函数,可以转换一些数据并将其存储在数据库中 所述函数的参数从Redis集合中弹出 只要Redis集合中有一个值,就可以在几个单独的线程中运行该函数 听起来你可能有一个 好的 问题 解决。在这种情况下,您可以简单地从编写代码开始 处理为处理第一个基准的顶
map
工作后,是时候添加p
(并行)到您的代码以使其
A.这是一个非常重要的问题
这是一种让你热身的好方法
机器。
是
关于pmap使用的线程数的讨论
以上是最简单的方法。如果你需要更好的控制 并发性 探索 用例。听起来您可能有一个 好的 问题 解决。在这种情况下,您可以简单地从编写代码开始 处理为处理第一个基准的顶级函数。 一旦成功,就把它包起来 a来处理所有的问题 数据顺序(串行,一次一个) 你可能想开始解决更大的问题,只需要几个 数据集中的项目。这将使您的测试更加顺利和可靠 更快 在
map
工作后,是时候添加p
(并行)到您的代码以使其
A.这是一个非常重要的问题
这是一种让你热身的好方法
机器。
是
关于pmap使用的线程数的讨论
以上是最简单的方法。如果你需要更好的控制 并发性 探索
用例。不知道问题的细节,很难做到精确。如您所述,有几种选择:
- 普通Java线程和线程池。如果您的问题类似于现有的Java解决方案,那么这可能是最简单的
- 使用
等简单的Clojure线程。使用future
启动线程并获得future
的结果非常容易promise
- 将
替换为map
(平行映射)。这在主要面向map/reduce的简单情况下会有所帮助pmap
- Claypoole库:许多工具使多线程变得更简单、更容易。请看和
- 普通Java线程和线程池。如果您的问题类似于现有的Java解决方案,那么这可能是最简单的
- 使用
等简单的Clojure线程。使用future
启动线程并获得future
的结果非常容易promise
- 将
替换为map
(平行映射)。这在主要面向map/reduce的简单情况下会有所帮助pmap
- Claypoole库:许多工具使多线程变得更简单、更容易。请看和
- 不知道问题的细节,很难做到精确。如您所述,有几种选择:
j.u.concurrent
库。有低级原语以及用于的工具。所有这些都可以在clojure中访问
从设计的角度来看,这取决于您是更受CPU限制还是更受I/O限制。这会影响决策,例如是否从redis执行并行读取并写入数据库。如果您是CPU受限的,因此您的瓶颈是计算,那么并行化从redis读取或写入数据库就没有多大意义了,不是吗?这些是要考虑的事情类型。
您确实需要解决两个问题:(1)您对clojure/java并发机制的熟悉程度,以及(2)您解决此问题的方法(即,无论您使用何种语言,您将如何解决此问题?)。一旦你解决了#2,你就会更好地了解我上面提到的使用哪些工具,以及如何使用它们。为了简单起见,未来是无与伦比的。它们创建一个新线程,并从中返回一个值。然而,您通常需要比它们提供的更细粒度的控制 core.async库对并行性有很好的支持(通过管道,见下文),并且它还提供自动背压。您必须有一种方法来控制数据流,这样就不会有人渴望工作,或者承受太多的工作负担。core.async通道必须是有界的,这有助于解决此问题。此外,这是一个非常符合逻辑的问题模型:从源中获取一个值,将其转换(可能使用a?)为给定值,然后将结果放入您的