如何将 go 块分配给 core.asyc 中的线程
how to allocate go blocks to threads in core.asyc
我一直在使用 core.async 一点点(服务器端),并且有一个关于将线程分配给 core.asyc go 循环的问题。
如果我有以下 go-block
(go (while true
(let [[v ch] (alts!! [@app/p4])]
(when (= :notify (:action v))
(do-notify v)))))
我看到这个和所有其他 go 块占用了我调用此函数的同一个线程。
我试过这个:
(dotimes [i 10]
(.start (Thread.
(fn []
(go (while true
(let [[v ch] (alts!! [@app/p4])]
(when (= :notify (:action v))
(do-notify v)))))))))
虽然它 "works" 我觉得我不必要地占用线程并且没有利用渠道的灵活性。使用 core.async 限制按需旋转线程的 clojure 方法是什么?
alts!!
阻塞线程。在 go 块内,你想使用 alts!
,它将停放它(也就是释放它,以便它可以 运行 其他 go 块)
您的解决方案基本上是正确的。事实上,它是如此正确,几乎正是 thread
宏所做的。
表达相同想法的更简单方法是:
(dotimes [i 10]
(thread
(go (while true
(let [[v ch] (alts! [@app/p4])]
(when (= :notify (:action v))
(do-notify v)))))))
我一直在使用 core.async 一点点(服务器端),并且有一个关于将线程分配给 core.asyc go 循环的问题。
如果我有以下 go-block
(go (while true
(let [[v ch] (alts!! [@app/p4])]
(when (= :notify (:action v))
(do-notify v)))))
我看到这个和所有其他 go 块占用了我调用此函数的同一个线程。
我试过这个:
(dotimes [i 10]
(.start (Thread.
(fn []
(go (while true
(let [[v ch] (alts!! [@app/p4])]
(when (= :notify (:action v))
(do-notify v)))))))))
虽然它 "works" 我觉得我不必要地占用线程并且没有利用渠道的灵活性。使用 core.async 限制按需旋转线程的 clojure 方法是什么?
alts!!
阻塞线程。在 go 块内,你想使用 alts!
,它将停放它(也就是释放它,以便它可以 运行 其他 go 块)
您的解决方案基本上是正确的。事实上,它是如此正确,几乎正是 thread
宏所做的。
表达相同想法的更简单方法是:
(dotimes [i 10]
(thread
(go (while true
(let [[v ch] (alts! [@app/p4])]
(when (= :notify (:action v))
(do-notify v)))))))