Clojure 当多个进程等待将数据放入同一通道时,顺序是否得到保证?

Clojure 当多个进程等待将数据放入同一通道时,顺序是否得到保证?,clojure,core.async,Clojure,Core.async,代码如下: (ns typedclj.core (:require [clojure.core.async :as a :refer [>! <! >!! <!! go chan buffer close! thread alts! alts!! timeout]]) (:gen-class)) (def mychan (chan)) (go (while true

代码如下:

(ns typedclj.core
  (:require [clojure.core.async
             :as a
             :refer [>! <! >!! <!! go chan buffer close! thread
                     alts! alts!! timeout]])
  (:gen-class))


(def mychan (chan))
(go (while true
      (>! mychan "what is this?")))
(go (loop [i 0]
      (>! mychan (str "msg" i))
      (recur (inc i))))
(go (loop [i 0]
      (>! mychan (str "reply" i))
      (recur (inc i))))
(go (loop [i 0]
      (>! mychan (str "curse" i))
      (recur (inc i))))
(ns typedclj.core
(:require[clojure.core.async
:作为
:参考[>!!mychan“这是什么?”)
(go(loop[i0]
(>!mychan(str“msg”i))
(重复(包括一次)))
(go(loop[i0]
(>!mychan(str“reply”i))
(重复(包括一次)))
(go(loop[i0]
(>!mychan(str“诅咒”i))
(重复(包括一次)))
repl中的一些实验表明,通道依次从4个进程中的每个进程获取数据:

(<!! mychan)
=> "what is this?"
(<!! mychan)
=> "msg0"
(<!! mychan)
=> "reply0"
(<!! mychan)
=> "curse0"
(<!! mychan)
=> "what is this?"
(<!! mychan)
=> "msg1"
(<!! mychan)
=> "reply1"
(<!! mychan)
=> "curse1"
(<!! mychan)
=> "what is this?"
(<!! mychan)
=> "msg2"
(<!! mychan)
=> "reply2"
(<!! mychan)
=> "curse2"
(“这是什么?”
(“msg0”
(“答复0”
(“curse0”
(“这是什么?”
(“msg1”
(“答复1”
(“诅咒1”
(“这是什么?”
(“msg2”
(“答复2”
(“诅咒2”

我想知道是否始终保持顺序,即在每个循环中,首先启动的进程也将首先馈送到通道。

唯一的保证是,顺序将保留在单个
go
块的消息中。例如,从通道读取时,您将看到来自某个
go的所有消息
block,与
go
block将它们放入频道的顺序相同。但是,这些消息可能与来自其他作者的消息交织在一起

在您的特定示例中,顺序似乎是确定的,但这是由于人类与REPL的交互缓慢造成的。当您在REPL中键入或粘贴代码时,
go
块开始竞争通道(它们会一直阻塞,直到有人准备从通道读取)

作为一个实验,您可以执行:

(dotimes [n 10000] (println (<!! mychan)))
如您所见,
curse2509
出现在
reply2509
之前

what is this?
msg2507
curse2508
reply2508
what is this?
msg2508
curse2509
reply2509
what is this?