Канал: связь между различными ядрами - PullRequest
0 голосов
/ 06 марта 2019

Я бы хотел, чтобы канал между двумя функциями работал на двух разных ядрах.Следующий код не работает:

c1=Channel(32)   
@spawnat 2 put!(c1,1)
@spawnat 3 println(c1)

println говорит мне, что канал c1 на ядре 3 пуст.Я не получаю ошибки.Каким-то образом функция на ядре 3 видит канал c1, отличный от ядра 2.

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Channel для связи между подпрограммами (иначе Green Threading).

Обычно для распределенных вычислений вы используете remotecall - см. Этот пример из Руководство Джулии :

$ ./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:

  • SharedArrays - общая память, обработанная наодин и тот же хост
  • DistributedArrays.jl - общие данные для разных процессов на разных хостах
  • ParallelDataTransfer.jl - отправка данных между процессами.
1 голос
/ 06 марта 2019

Это работает

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

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

...