Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 为什么特工返回零而不在clojure等待?_Concurrency_Clojure - Fatal编程技术网

Concurrency 为什么特工返回零而不在clojure等待?

Concurrency 为什么特工返回零而不在clojure等待?,concurrency,clojure,Concurrency,Clojure,这里,如果我第一次调用read file,它将返回nil。对于所有后续调用,它返回文件内容。为什么呢?当我使用atom时,它工作正常。另外,为什么slurp%2需要第二个参数?当我只给%时,它不起作用?我得到以下错误: (def file (agent nil)) (defn read-file [] (if (= @file nil) (do (println "read-file") (send-off file #(

这里,如果我第一次调用read file,它将返回nil。对于所有后续调用,它返回文件内容。为什么呢?当我使用atom时,它工作正常。另外,为什么slurp%2需要第二个参数?当我只给%时,它不起作用?我得到以下错误:

(def file (agent nil))

(defn read-file []
    (if (= @file nil)
        (do
            (println "read-file")
            (send-off file #(slurp %2) (io/resource "file.txt")))
        nil)
    @file)

代理上的Deref提供当前状态的快照。代理初始化为nil,因此在初始状态下取消对它的引用将返回nil


如果要等到结果可用,可以使用或调用代理。如果只有一个行动产生结果,未来将是我的第一选择。在这个特定的示例中,我只编写slurp io/resource file.txt,而没有任何并发构造

代理上的Deref提供当前状态的快照。代理初始化为nil,因此在初始状态下取消对它的引用将返回nil


如果要等到结果可用,可以使用或调用代理。如果只有一个行动产生结果,未来将是我的第一选择。在这个特定的示例中,我只编写slurp io/resource file.txt,而没有任何并发构造

代理是错误的并发原语。它有你不想要的所有特征,没有你想要的。相反,由于要缓存的对象是单个昂贵的操作,因此请使用延迟:

clojure.lang.ArityException: Wrong number of args (2) passed to: core/read-file/fn--3603

代理是错误的并发原语。它有你不想要的所有特征,没有你想要的。相反,由于要缓存的对象是单个昂贵的操作,因此请使用延迟:

clojure.lang.ArityException: Wrong number of args (2) passed to: core/read-file/fn--3603

谢谢,在deref开始工作之前添加Wait。您知道为什么在slurp中需要%2而不是%?如果我要用未来来表示送别应该用未来来包装,对吗?我不能让它和未来一起工作。它给出了相同的行为。你有什么例子吗?顺便说一句,这个代码对我来说没有意义。为什么读取文件不仅仅是slurp io/resource file.txt?而不是使用代理?您需要%2,因为匿名函数的第一个参数是代理的状态。我想缓存结果。使用未来是行不通的。@kadaj那么我会使用原子。def content atom slurp io/resource file.txt谢谢,在deref工作之前添加WAIT。您知道为什么在slurp中需要%2而不是%?如果我要用未来来表示送别应该用未来来包装,对吗?我不能让它和未来一起工作。它给出了相同的行为。你有什么例子吗?顺便说一句,这个代码对我来说没有意义。为什么读取文件不仅仅是slurp io/resource file.txt?而不是使用代理?您需要%2,因为匿名函数的第一个参数是代理的状态。我想缓存结果。使用未来是行不通的。@kadaj那么我会使用原子。def content atom slurp io/resource文件。txtI不确定这是否是他想要的。延迟会将计算推迟到将来,直到您意识到这一点。例如,这需要20秒:time do def d delay Thread/sleep 10000 1 Thread/sleep 10000@d。此外,还不清楚kadaj的产品是否昂贵。他可能只是想读一个文本文件并将内容存储在某个地方。至少,这是我从下面的对话中所理解的我的答案。@MichielBorkent,在这种情况下,他可以使用承诺。无论如何,代理显然是错误的抽象概念。我不确定这是否是他想要的。延迟会将计算推迟到将来,直到您意识到这一点。例如,这需要20秒:time do def d delay Thread/sleep 10000 1 Thread/sleep 10000@d。此外,还不清楚kadaj的产品是否昂贵。他可能只是想读一个文本文件并将内容存储在某个地方。至少,这是我从下面的对话中所理解的我的答案。@MichielBorkent,在这种情况下,他可以使用承诺。无论如何,代理显然是错误的抽象。