Julia 朱莉娅:如何使用频道进行迭代
当我运行下面的代码时,我得到了一个反对意见,说product已经被channels替换了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 = "
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