我有轻量级的 CPU 密集型功能,我想并行运行。我应该使用什么并发原语?
使用代理和期货是不值得的,因为为这些过程创建新线程的成本是不合理的。
我想基本上同时运行一些轻量级功能,而不创建线程。我可以这样做吗?
谢谢,穆尔塔萨
我有轻量级的 CPU 密集型功能,我想并行运行。我应该使用什么并发原语?
使用代理和期货是不值得的,因为为这些过程创建新线程的成本是不合理的。
我想基本上同时运行一些轻量级功能,而不创建线程。我可以这样做吗?
谢谢,穆尔塔萨
你做过基准测试吗?
无论如何,代理很可能是一个很好的解决方案,因为它们使用可重复使用的固定大小的线程池(因此您不会不断地创建新线程)。
我已经在我的机器上快速进行了基准测试,并且可以在 3 秒内完成超过百万次的代理调用:
(def ag (agent 0))
(time (dotimes [i 1000000] (send ag inc)))
=> "Elapsed time: 2882.170586 msecs"
如果代理仍然过于重量级(不太可能?),那么您可能应该寻找一种方法将一组功能分批成一个工作块。如果你这样做,那么并发原语的开销将是最小的。