2013-02-18 50 views
3

我想要并行运行轻型CPU密集型功能。什么是我应该使用的并发原语?同时运行灯光功能

代理商和期货的使用不值得,因为为这些流程创建新线程的成本是不合理的。

我想基本上同时运行一些轻功能,而不创建线程。我可以那样做吗?

感谢, 穆尔塔扎

+1

您可能需要的是协同例程,但我不确定是否存在clojure的实现 – Ankur 2013-02-18 11:59:04

+0

是的,像Erlang这样的轻量级进程会是一个不错的选择。 – murtaza52 2013-02-18 12:07:04

回答

5

你有基准?

无论如何,代理可能是一个很好的解决方案,因为它们使用一个固定大小的线程池来重用(所以你不会不断创建新线程)。

我赶紧基准我的机器上,可以做超过百万剂在3秒内来电:

(def ag (agent 0)) 

(time (dotimes [i 1000000] (send ag inc))) 
=> "Elapsed time: 2882.170586 msecs" 

如果代理人仍然过于重量级(?不太可能),那么你或许应该寻找一种方式将一组功能分组为一组工作。如果你这样做,那么并发原语的开销就会很小。

+0

Mikera谢谢你的回答。不,我没有基准,因为我正在设计最初的设计。所以避免了创建线程的开销,但是在上下文切换中会产生多少开销?任何统计数据(基准:))呢? – murtaza52 2013-02-18 12:10:31

+1

添加快速测试。代理相当快,你可以看到... – mikera 2013-02-18 13:07:57

+0

谢谢Mikera! – murtaza52 2013-02-18 13:55:47