clojure中有1000万个线程

clojure中有1000万个线程,clojure,Clojure,我正在进行基于代理的模拟,大约有1000万个代理 代理将在几天/几周内不做任何事情,当他们必须做一些事情时,这不是cpu密集型的(应该需要

我正在进行基于代理的模拟,大约有1000万个代理

代理将在几天/几周内不做任何事情,当他们必须做一些事情时,这不是cpu密集型的(应该需要<1ms)

产生1000万个线程是一件合理的事情吗?我已经读过
线程/睡眠
未来
这两本书,它们似乎很有希望


任何关于这样一个项目的建议或建议阅读都将不胜感激。

如果您使用Clojure的内置程序,这些程序将在线程池中运行,并且只消耗少量ram。事件可以根据您的需要以各种方式发送到这些代理。Clojure项目中有1000万名代理是可以的。使用异步编程库(如and)和10M go块(而不是代理)也可能是值得的

这些代理是否有显著不同的行为?或者它们的行为可以从几个模型中派生出来,并进一步配置数据?如果您对这两个问题都不回答,那么您可能需要考虑使用异步队列作为设计的主要构建块。 你绝对应该认真对待Charles Duffy的建议,了解更多关于
Thread/sleep
的功能以及线程通常是如何工作的。但我认为设计的问题与其说是技术问题,不如说是技术问题


如果您可以提供更多关于您试图完成的任务性质的详细信息,我可能可以编辑此答案并提供更具体的答案。

我不建议为您描述的场景创建1000万个线程。讨论与创建线程相关的一些开销。例如,默认情况下,每个线程都分配了256Kb的堆栈空间。您可以计算10000000个线程的含义。当然,您可以减少每个线程的堆栈大小,但它仍然会占用大量内存。
thread/sleep
绝对是错误的使用方法——这意味着您正在阻塞线程池中的一个插槽,因此没有其他进程可以使用该线程运行,因此您正在增加real(操作系统级别)的数量如果使用它(或在执行器中执行任何其他阻塞操作),则需要线程。如果您使用类似于
core.async
,那么当单个goroutine不需要时,线程池中的一个插槽可以被转移到另一个任务。也就是说,我们对您的问题空间了解不够,无法推荐正确的工具。