2017-07-08 85 views
1

当我运行下面的代码时,我得到一个弃用说产品已被替换为频道。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 

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

任何想法?

+0

我在下面给出了一个答案,但只是指出你在这里使用Task的方式是错误的,即使在旧的语法中也是如此。任务只接受一个没有参数作为输入的函数(所以如果你想调用另一个函数which_does_接受参数,你应该用匿名函数“包装”它)。 –

+0

谢谢。是的,我刚刚复制了一个生产示例,需要添加目录源。 –

回答

2

这是一种方法。修改你的函数接受一个通道参数,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 

,或者使用通道本身作为一个迭代(迭代任务正在变得过时,与生成/使用的功能一起)

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

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