Clojure-何时取消引用原子?

时间:2018-11-18 14:51:17

标签: clojure thread-safety

在Clojure中取消引用原子时,我感到困惑。在下面的代码中,我有一个server-request函数,该函数接收数据并更新request-result-data,后者只是由请求ID索引的映射。该功能将阻塞,直到服务器完成数据发送,然后返回请求ID。下面的第一个代码段按预期工作。第二个没有,因为(看来)@ request-result-data在函数返回之前已被取消引用。

;works
(let [req-id (server-request "parameters")]
  (pprint (@request-result-data req-id)))

;returns nil
(pprint (@request-result-data (server-request "parameters"))))

这是正常行为吗?有没有更好的方法编写此代码?从直觉上看,这里似乎不需要let

谢谢

1 个答案:

答案 0 :(得分:2)

如果[ { from_place_id: 5, to_place_id: 3, ... }, { from_place_id: 3, to_place_id: 8, ... }, { from_place_id: 8, to_place_id: 1, ... }, ] 函数正在修改server-request原子,那么确实需要使用第一种形式来确保事情以正确的顺序进行。如果您有函数调用request-result-data,则不应依赖于(E1 E2)E1以任何特定顺序进行求值。

在没有任何其他上下文的情况下,我想知道为什么您不能E2返回信息而不是将其放到原子中,但这超出了您的原始问题。