Julia 朱莉娅:如何使用频道进行迭代

Julia 朱莉娅:如何使用频道进行迭代,julia,Julia,当我运行下面的代码时,我得到了一个反对意见,说product已经被channels替换了 function source(dir) filelist = readdir(dir) for filename in filelist name,ext = splitext(filename) if ext == ".jld" produce(filename) end end end path = "

当我运行下面的代码时,我得到了一个反对意见,说product已经被channels替换了

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!而不是没有运气的生产


有什么想法吗?

这里有一种方法。修改函数以接受通道参数,然后
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
函数包装为匿名函数):

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

julia> while isopen( my_channel)
         take!( my_channel) |> println;
       end
no.jld
yes.jld
或者,将通道本身用作迭代器(对任务的迭代以及生产/消费功能越来越不受欢迎)


或者,根据文档,您可以将
@schedule
bind
等一起使用,但上面的方法似乎是最简单的方法。

我在下面给出了答案,但只是指出,您在这里使用Task的方法是错误的,即使在旧语法中也是如此。任务只接受一个没有参数的函数作为输入(因此,如果您想调用另一个没有参数的函数,您应该将其“包装”到匿名函数中)。谢谢。是的,我刚刚复制了一个product示例,需要添加dir源代码。
julia> while isopen( my_channel)
         take!( my_channel) |> println;
       end
no.jld
yes.jld
julia> for i in my_channel
         i |> println
       end
no.jld
yes.jld