我无法理解如何使用工作进程和模块。我会试着简单地解释一下我的困难。
我的主要流程(流程1)上有一个模块module A
。
在工作进程上,我有module B
,它应该处理许多复杂的计算(通常是并行工作者的情况)。
问题在于,似乎需要在工人身上定义module A
......
问题是module A
远大于module B
,它包含数千行代码,但module B
仅使用大约15个短函数。
是否有任何解决方法,以便我可以让我的主要工作人员可以访问module A
,但工作人员可以访问module B
,但能够通过module A
中的方法呼叫工作人员,并制作他们运行module B
中定义的函数?例如,module B
中可能有一个名为calculate_stuff()
的方法。
我希望实现的结构如下:
module A # main worker process using this module
function call_worker_and_calculate()
remotecall_fetch(calculate_stuff, 2)
end
export call_worker_and_calculate
end
module B # worker process 2 is using this module
function calculate_stuff()
# some stuff
end
export calculate_stuff
end
此特定示例将返回错误消息:
julia> A.call_worker_and_calculate()
ERROR: On worker 2:
UndefVarError: A not defined
答案 0 :(得分:2)
错误消息很奇怪(我无法使用您的代码重现它,您使用的是哪个版本?)。所以我不确定这会回答你的问题。
如果您想使用其他模块B
中的模块A
中的名称,则import
中必须using
或B
模块A
}}
为了实现这一目标,B
必须位于Julia变量LOAD_PATH
中包含的路径中,或者在@everywhere
的所有工作人员上定义定义之前A
,例如,
@everywhere module B # defined on all workers
function calculate_stuff()
# do stuff
end
export calculate_stuff
end
module A # only defined on the main worker process
using B # introduces calculate_stuff into A's scope because it is exported in B
function call_worker_and_calculate()
remotecall_fetch(calculate_stuff, 2)
end
export call_worker_and_calculate
end
然后A.call_worker_and_calculate()
有效,A
也没有在其他工作人员身上定义:
julia> remotecall_fetch(whos,2)
From worker 2: B 4537 bytes Module
From worker 2: Base 34048 KB Module
From worker 2: Core 12482 KB Module
From worker 2: Main 40807 KB Module