Multithreading Clojure:创建和管理多个线程

Multithreading Clojure:创建和管理多个线程,multithreading,clojure,Multithreading,Clojure,我写了一个程序,需要处理一个非常大的数据集,我计划在一台高端机器上用多个线程运行它 我是Clojure的初学者,我迷失在可供使用的无数工具中- 代理、期货、core.async(和石英岩?)。我想知道哪一个最适合这份工作 以下是我的情况: 我有一个函数,可以转换一些数据并将其存储在数据库中 所述函数的参数从Redis集合中弹出 只要Redis集合中有一个值,就可以在几个单独的线程中运行该函数 听起来你可能有一个 好的 问题 解决。在这种情况下,您可以简单地从编写代码开始 处理为处理第一个基准的顶

我写了一个程序,需要处理一个非常大的数据集,我计划在一台高端机器上用多个线程运行它

我是Clojure的初学者,我迷失在可供使用的无数工具中- 代理、期货、core.async(和石英岩?)。我想知道哪一个最适合这份工作

以下是我的情况:

  • 我有一个函数,可以转换一些数据并将其存储在数据库中
  • 所述函数的参数从Redis集合中弹出
  • 只要Redis集合中有一个值,就可以在几个单独的线程中运行该函数 听起来你可能有一个 好的 问题 解决。在这种情况下,您可以简单地从编写代码开始 处理为处理第一个基准的顶级函数。 一旦成功,就把它包起来 a来处理所有的问题 数据顺序(串行,一次一个)

    你可能想开始解决更大的问题,只需要几个 数据集中的项目。这将使您的测试更加顺利和可靠 更快

    map
    工作后,是时候添加
    p
    (并行)到您的代码以使其 A.这是一个非常重要的问题 这是一种让你热身的好方法 机器。 是 关于pmap使用的线程数的讨论


    以上是最简单的方法。如果你需要更好的控制 并发性 探索 用例。

    听起来您可能有一个 好的 问题 解决。在这种情况下,您可以简单地从编写代码开始 处理为处理第一个基准的顶级函数。 一旦成功,就把它包起来 a来处理所有的问题 数据顺序(串行,一次一个)

    你可能想开始解决更大的问题,只需要几个 数据集中的项目。这将使您的测试更加顺利和可靠 更快

    map
    工作后,是时候添加
    p
    (并行)到您的代码以使其 A.这是一个非常重要的问题 这是一种让你热身的好方法 机器。 是 关于pmap使用的线程数的讨论


    以上是最简单的方法。如果你需要更好的控制 并发性 探索
    用例。

    不知道问题的细节,很难做到精确。如您所述,有几种选择:

    • 普通Java线程和线程池。如果您的问题类似于现有的Java解决方案,那么这可能是最简单的
    • 使用
      future
      等简单的Clojure线程。使用
      future
      启动线程并获得
      promise
      的结果非常容易
    • map
      替换为
      pmap
      (平行映射)。这在主要面向map/reduce的简单情况下会有所帮助
    • Claypoole库:许多工具使多线程变得更简单、更容易。请看和

      • 不知道问题的细节,很难做到精确。如您所述,有几种选择:

        • 普通Java线程和线程池。如果您的问题类似于现有的Java解决方案,那么这可能是最简单的
        • 使用
          future
          等简单的Clojure线程。使用
          future
          启动线程并获得
          promise
          的结果非常容易
        • map
          替换为
          pmap
          (平行映射)。这在主要面向map/reduce的简单情况下会有所帮助
        • Claypoole库:许多工具使多线程变得更简单、更容易。请看和

        简单地说,未来是无与伦比的。它们创建一个新线程,并从中返回一个值。然而,您通常需要比它们提供的更细粒度的控制

        core.async库对并行性有很好的支持(通过管道,见下文),并且它还提供自动背压。您必须有一种方法来控制数据流,这样就不会有人渴望工作,或者承受太多的工作负担。core.async通道必须是有界的,这有助于解决此问题。此外,这是一个非常符合逻辑的问题模型:从源中获取一个值,将其转换(可能使用a?)为给定值,然后将结果放入数据库

        您还可以手动使用Java优秀的
        j.u.concurrent
        库。有低级原语以及用于的工具。所有这些都可以在clojure中访问

        从设计的角度来看,这取决于您是更受CPU限制还是更受I/O限制。这会影响决策,例如是否从redis执行并行读取并写入数据库。如果您是CPU受限的,因此您的瓶颈是计算,那么并行化从redis读取或写入数据库就没有多大意义了,不是吗?这些是要考虑的事情类型。


        您确实需要解决两个问题:(1)您对clojure/java并发机制的熟悉程度,以及(2)您解决此问题的方法(即,无论您使用何种语言,您将如何解决此问题?)。一旦你解决了#2,你就会更好地了解我上面提到的使用哪些工具,以及如何使用它们。

        为了简单起见,未来是无与伦比的。它们创建一个新线程,并从中返回一个值。然而,您通常需要比它们提供的更细粒度的控制

        core.async库对并行性有很好的支持(通过管道,见下文),并且它还提供自动背压。您必须有一种方法来控制数据流,这样就不会有人渴望工作,或者承受太多的工作负担。core.async通道必须是有界的,这有助于解决此问题。此外,这是一个非常符合逻辑的问题模型:从源中获取一个值,将其转换(可能使用a?)为给定值,然后将结果放入您的