Julia:如何与Channel进行迭代

时间:2017-07-08 15:11:42

标签: julia

当我运行以下代码时,我得到一个弃用,称产品已被渠道替换。

function source(dir)
    filelist = readdir(dir)

    for filename in filelist
        name,ext = splitext(filename)
        if ext == ".jld"
            produce(filename)
        end
    end
end

path = "somepathdirectoryhere"

for fname in Task(source(path))
    println(fname)
end

我找不到关于如何使用频道执行此操作的示例。我已经尝试创建一个全局频道并使用put!而不是生产没有运气。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

这是一种方式。修改您的函数以接受通道参数,并在其中包含put!数据:

function source(dir, chnl)
  filelist = readdir(dir)
  for filename in filelist
    name, ext = splitext(filename)
    if ext == ".jld"
      put!(chnl, filename)  % this blocks until "take!" is used elsewhere
    end
  end
end

然后使用Channel构造函数隐式地创建 任务(它使用一个只有一个参数来表示通道的函数,所以我们需要包装source函数一个匿名函数):

my_channel = Channel( (channel_arg) -> source( pwd(), channel_arg) )

然后,检查通道是否仍处于打开状态(即任务尚未完成),如果是,则采取参数:

julia> while isopen( my_channel)
         take!( my_channel) |> println;
       end
no.jld
yes.jld

或者,使用 channel 本身作为迭代器(迭代任务已被弃用,以及产生/消费功能)

julia> for i in my_channel
         i |> println
       end
no.jld
yes.jld

或者,您可以根据文档使用@schedulebind等,但似乎以上是最直接的方法。