【问题标题】:10 millions threads in clojureclojure 中有 1000 万个线程
【发布时间】:2014-06-19 14:27:39
【问题描述】:

我正在开发一个基于代理的模拟,大约有 1 个。 1000 万代理。

代理将连续数天/数周无所事事,而当他们必须做某事时,这不是 cpu 密集型的(应该花费

尝试生成 1000 万个线程是否合理?我已经阅读了 Thread/sleepfuture 似乎很有希望。

对于此类项目的任何建议或建议阅读将不胜感激。

【问题讨论】:

  • 我不建议为您描述的场景创建 1000 万个线程。 This answer 谈到了与创建线程相关的一些开销。例如,默认情况下,每个线程都分配有 256Kb 的堆栈空间。您可以计算出这对 10,000,000 个线程意味着什么。当然,您可以减少每个线程的堆栈大小,但它仍然会占用大量内存。
  • Thread/sleep绝对使用错误的东西-这意味着您阻塞了线程池中的一个插槽,因此没有其他进程可以使用该线程运行,所以如果你使用它(或在你的执行程序中执行任何其他阻塞操作),你正在增加你需要的真实(操作系统级)线程的数量。如果你使用core.async 之类的东西,那么当一个单独的 goroutine 不需要它时,线程池中的一个槽可以被移交给不同的任务。也就是说,我们对您的问题空间的了解几乎不足以推荐合适的工具。

标签: clojure


【解决方案1】:

如果您使用 Clojure 内置的 agents,它们会在线程池中运行,并且只会消耗少量的 ram。可以根据您的需要以各种方式将事件分派给这些代理。在 Clojure 程序中拥有 1000 万个代理是很好的。使用 core.async 之类的异步编程库之一并拥有 1000 万个 go 块而不是代理也可能是值得的。

【讨论】:

    【解决方案2】:

    这些代理的行为是否有显着不同?或者他们的行为可以从几个模型中衍生出来并进一步配置数据?如果您对这两个问题都回答“否”,您可能需要考虑使用异步队列作为您设计的主要构建块。

    您绝对应该认真对待 Charles Duffy 的建议,并详细了解 Thread/sleep 的作用以及线程的一般工作原理。但我认为这里的设计问题与其说是技术问题,不如说是relating building blocks of a program with real world objects to a fault

    如果您能提供更多关于您想要完成的工作性质的详细信息,我或许可以编辑此答案并提供更具体的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2017-11-13
      • 2018-10-03
      • 1970-01-01
      • 2013-02-17
      • 2014-09-04
      相关资源
      最近更新 更多