Канал: связь между разными ядрами

#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:

Ответ №2:

Это работает

 const c1=RemoteChannel(()->Channel{Int}(32));
@spawnat 2 put!(c1,1)
@spawnat 3 println(take!(c1))
  

Найдено здесь