Как мне сделать ввод / вывод в Julia, распределенный для l oop, неинтерактивно? - PullRequest
2 голосов
/ 24 февраля 2020

Со следующим кодом в foo.jl:

using Distributed

@distributed for k = 1:4
    println("Creating file ", k)
    write(string("file_", k), "foo")
end

при выполнении include("foo.jl") в REPL печатаются ожидаемые строки и создаются ожидаемые файлы, но когда я выхожу из REPL и запускаю

julia foo.jl

Ничего не написано и файлы не созданы.

Почему есть разница, и что требуется для сценария, чтобы он работал должным образом вне REPL?

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Как указано в документации :

Обратите внимание, что без функции-редуктора @distributed выполняется асинхронно, то есть порождает независимые задачи для всех доступных рабочих и немедленно возвращается без ожидания для завершения. Чтобы дождаться завершения, добавьте к вызову префикс @sync

. В вашем случае (который не использует функцию-редуктор) происходит следующее: @distributed порождает задачи и сразу же возвращается. Ваши задачи настолько короткие, что в REPL вы видите их почти сразу, и не замечаете разницу с синхронным процессом (за исключением того, что, возможно, вывод смешивается с приглашением REPL).

In однако в сценарии основной процесс julia завершается сразу же после того, как он порождает задачи, и у них нет никаких причин фактически их запускать. И вы не увидите выходных данных.

Как указано в документации, используйте @sync, чтобы дождаться завершения задач перед их существованием:

using Distributed

@sync @distributed for k = 1:4
    println("Creating file ", k)
    write(string("file_", k), "foo")
end
1 голос
/ 24 февраля 2020

@distributed не блокируется, поэтому процесс Julia завершается до того, как записаны какие-либо файлы. Попробуйте вместо

using Distributed

@sync @distributed for k = 1:4
    println("Creating file ", k)
    write(string("file_", k), "foo")
end

.

...