【发布时间】:2021-05-04 08:29:52
【问题描述】:
我想同时使用Channel 来生成必须评估函数的值,并使用Threads.@threads 并行化该函数的评估。
在没有任何多线程的情况下,我的 MWE 是:
#####
# Produces input values
function producer(c::Channel)
nb_inputs = rand(1:10)
for n=1:nb_inputs
println("Generating | ",n)
put!(c,n)
end
end
#####
# Expensive function
function f(n::Int64)
println("Running | ",n)
sleep(2.0)
end
#####
# Evaluates the function over all the input values
function test()
for n in Channel(producer)
f(n)
end
end
#####
test()
这里,producer(c) 返回输入值; f(n) 是一个昂贵的函数(其评估都是相互独立的); test() 根据生产者返回的所有输入值评估函数。
现在,我想在多个线程上并行运行test() 中的for 循环。
天真地,我试过了
Threads.@threads for n in Channel(producer)
然而,这失败了,因为 Channel 的元素数量最初是未知的。
我该如何规避这个问题?
【问题讨论】:
标签: multithreading julia channel