Многопоточность Джулия показывает ошибку при перечислении итератора

Почему этот очень простой код приводит к ошибке в Julia 1.1?

Threads.@threads for (index,value) in enumerate([0.1,0.2,0.3])
    println(value^index)

end

Показанная ошибка:

Error thrown in threaded loop on thread 0: MethodError(f=typeof(Base.unsafe_getindex)(), args=(Base.Iterators.Enumerate{Array{Float64, 1}}(itr=Array{Float64, (3,)}[0.1, 0.2, 0.3]), 1), world=0x00000000000069dc)
Error thrown in threaded loop on thread 1: MethodError(f=typeof(Base.unsafe_getindex)(), args=(Base.Iterators.Enumerate{Array{Float64, 1}}(itr=Array{Float64, (3,)}[0.1, 0.2, 0.3]), 3), world=0x00000000000069dc)

Я хочу использовать Threads.@threads с более сложными кодами, где я использую итератор enumerate.


person coolsv    schedule 23.08.2019    source источник


Ответы (1)


Threads.@threads marco ожидает, что массив будет только перебираться. Здесь у вас есть ссылка на тема по беседе по ней.

Итак, в настоящее время вам нужно перебирать индексы, используя, например, axes или например collect eachindex (что не идеально).

Итак, в вашем случае это будет:

vec = [0.1,0.2,0.3]
Threads.@threads for index in axes(vec, 1)
    println(vec[index]^index)
end

or

Threads.@threads for (index,value) in collect(enumerate([0.1,0.2,0.3]))
    println(value^index)
end
person Bogumił Kamiński    schedule 23.08.2019
comment
О, я вижу! Тогда я должен быть осторожен с итераторами. Думаю, то же самое будет и с eachrow() итератором, с которым у меня тоже были проблемы. Спасибо! - person coolsv; 24.08.2019
comment
Да - eachrow в базе - это Generator. Но, например, eachrow в DataFrames.jl - это AbstractVector, поэтому он будет работать. - person Bogumił Kamiński; 24.08.2019
comment
Спасибо за полезное объяснение :-) Как всегда :-) - person coolsv; 24.08.2019
comment
Также обратите внимание, что в Julia 1.1 использование println не рекомендуется, поскольку ввод-вывод не является потокобезопасным. Используйте для этого Julia 1.3, см. github.com/JuliaLang/julia/blob /release-1.3/NEWS.md. - person Bogumił Kamiński; 24.08.2019