#julia #channel
#julia #канал
Вопрос:
Я хотел бы иметь канал между двумя функциями, работающими на двух разных ядрах. Следующий код не работает:
c1=Channel(32)
@spawnat 2 put!(c1,1)
@spawnat 3 println(c1)
println сообщает мне, что канал c1 в ядре 3 пуст. Я не получаю никакой ошибки. Каким-то образом функция на ядре 3 видит другой канал c1, чем на ядре 2.
Ответ №1:
Channel
предназначен для связи между совместными подпрограммами (он же Green Threading).
Для распределенных вычислений, которые вы обычно используете remotecall
— смотрите этот пример из руководства Julia:
$ ./julia -p 2
julia> r = remotecall(rand, 2, 2, 2)
Future(2, 1, 4, nothing)
julia> s = @spawnat 2 1 . fetch(r)
Future(2, 1, 5, nothing)
julia> fetch(s)
2×2 Array{Float64,2}:
1.18526 1.50912
1.16296 1.60607
В зависимости от вашего реального сценария вам следует ознакомиться со следующими библиотеками для распределенных вычислений с помощью Julia:
- Общие массивы — общая память, обрабатываемая на одном хосте
- DistributedArrays.jl — общие данные для разных процессов на разных хостах
- ParallelDataTransfer.jl — отправка данных между процессами.
Ответ №2:
Это работает
const c1=RemoteChannel(()->Channel{Int}(32));
@spawnat 2 put!(c1,1)
@spawnat 3 println(take!(c1))