Рабочий, вызывающий функцию, не печатает - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь отладить параллельную программу в Джулии и хотел бы увидеть распечатки ее работников, но они, похоже, не могут печатать.Как я могу это исправить?

Мой тестовый код:

function Test()
  print("Worker ",myid())
end

for i in workers()
  @spawnat i Test()
end

1 Ответ

0 голосов
/ 02 октября 2018

Функция Test не определена на удаленных работниках, вы не используете fetch и, следовательно, она молча завершается сбоем.Использование myid() также требует загрузки Distributed на удаленных рабочих.И последнее, но не менее важное: стандартный вывод для удаленных работников кэшируется на уровне строки, и поэтому вам нужно использовать println вместо print.

Вот правильный код:

using Distributed
@everywhere Distributed
@everywhere function Test()
    println("Worker ",myid())
end

for i in workers()
    fetch(@spawnat i Test())
end

После комментария Богумила - fetch здесь, поэтому ваш код не завершается с ошибкой по какой-то другой причине.Вам нужно будет использовать макросы @async и @sync для сбора данных:

jobs = Dict{Int,Future}()
@sync for i in workers()
    @async jobs[i] = @spawnat i Test()
end

@sync for i in workers()
    @async fetch(jobs[i])
end
...