Я сделал модуль с условием if на количество ядер.
module mymodule
import Pkg
import PyCall
using Distributed
if nworkers() > 1
@everywhere using Pkg
@everywhere Pkg.activate(".")
@everywhere Pkg.instantiate()
@everywhere using PyCall
@everywhere @pyimport scipy.signal as ss
function parallel()
....
end
else
using Pkg
Pkg.activate(".")
Pkg.instantiate()
using PyCall
@pyimport scipy.signal as ss
function serial()
....
end
end
end #mymodule
Код выдает следующую ошибку при выполнении
ERROR: LoadError: LoadError: UndefVarError: @pyimport not defined
Stacktrace:
[1] top-level scope
[2] include at ./boot.jl:326 [inlined]
[3] include_relative(::Module, ::String) at ./loading.jl:1038
[4] include(::Module, ::String) at ./sysimg.jl:29
[5] include(::String) at ./client.jl:403
[6] top-level scope at none:0
in expression starting at /storage/work/s/mymodule.jl:81
in expression starting at /storage/work/s/mymodule.jl:30
где строка 81 — это строка в состоянии else, соответствующая @pyimport scipy.signal as ss
, а строка 30 — if nworkers() > 1
.
До этой проблемы в коде была проблема со строкой @everywhere @pyimport scipy.signal as ss
, но она исчезала при использовании import PyCall
; как ни странно, это не решило прежнюю проблему.
Кто-нибудь сталкивался с подобной проблемой или знал о таких проблемах?
Вместо этого вам нужно использовать pyimport
функция. Определение макроса (исходит из вашего using
) и использование этого макроса в том же блоке не работает из-за порядка синтаксического анализа/оценки.
Просто измените код
@pyimport scipy.signal as ss
к
ss = pyimport("scipy.signal")
Вы также можете разделить блоки на два, первый для определений, а второй для использования. Однако я бы так делать не стал, так как @pyimport
макрос уже устарело.