Как динамически загружать модули (или скрипты) во время выполнения с помощью Julia 1.5

Мне было интересно, можно ли определить модули (или скрипты)

# SomeName.jl

module SomeName
export worker()

function worker()
    println( @__FILE__ )
    ...
    return
end

и

# SomeOtherName.jl

module SomeOtherName
export worker()

function worker()
    println( @__FILE__ )
    ...
    return
end

чтобы загружать их динамически и вызывать их стандартные рабочие функции, такие как

function foo() 
    ...
    modname = "SomeName"    # in practice we would call something like retrievename() 
    mod = import( modname ) # imports the module (or includes the script)
    
    mod.worker()            # calls the worker function
end

Функциональность должна быть аналогична динамической загрузке с помощью Libdl.dlopen(), Libdl.dlsym() в LINUX или LoadLibrary(), GetProcAddress() в Windows. Но я предполагаю, что для Джулии это может быть даже более элегантно.

Было бы интересно узнать это как для модулей, так и для скриптов.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
272
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это, но это плохая идея, учитывая, как Джулия сочетает компиляцию с множественной отправкой.

Предположим, у вас есть следующий файл:

shell> more Foo3.jl
module Foo3
    export hello
    hello() = "hello3"
end

Теперь у вас может быть следующая функция:

function foo(m::AbstractString)
    include(m * ".jl")
    Main.eval(Meta.parse("using Main.$m"))
    mod = getfield(Main, Symbol(m))
    Base.invokelatest(mod.hello)
end

Обратите внимание, что в этом случае невозможно просто скомпилировать функцию foo, поэтому нам пришлось использовать Base.invokelatest.

Теперь вы можете протестировать его:

julia> foo("Foo3")
"hello3"

Обычно я загружаю все модули (имея их в виде пакетов Julia), а затем выбираю динамически, как в примере ниже:

julia> getfield(Main, Symbol("Foo3")).hello()
"hello3"

Хорошо, спасибо, работает отлично. Как это будет выглядеть для динамически загружаемых модулей вместо скриптов? (для небольших скриптов это имеет смысл, если кто-то хочет заменить вычислительную процедуру без остановки серверного процесса)

TomS 21.12.2020 16:36

Вы просто удаляете строку include. Остальной код посвящен модулям.

Przemyslaw Szufel 21.12.2020 16:37

Другие вопросы по теме