将 Julia 函数定位到 multiprocessing.Process of Python 时出错

Iva*_*hor 5 python multiprocessing julia pycall

我正在尝试使用针对 Julia 函数的 multiprocessing.Process 来并行化 python 中的代码。

当我直接调用它时,即当我执行时,该函数工作正常:


if __name__ == "__main__":
    import julia
    julia.Julia(compiled_modules=False)
    julia.Pkg_jl.func_jl(*args)

Run Code Online (Sandbox Code Playgroud)

但是,当我在Process函数中定义相同的函数作为目标时,出现错误。

这是代码:

from multiprocessing import Process
import julia
julia.Julia(compiled_modules=False)

class JuliaProcess(object):
...

    def _wrapper(self, *args):
        ret = julia.Pkg_jl.func_jl(args)
        self.queue.put(ret) # this is for save the result of the function
    
    def run(self, *args):
        p = Process(target=self._wrapper, args=args)
        self.processes.append(p) # this is for save the process job
        p.start()
...


if __name__ == "__main__":
    ...
    Jlproc = JuliaProcess()
    Jlproc.run(some_args)

Run Code Online (Sandbox Code Playgroud)

错误发生在进程启动时,并显示以下输出:

fatal: error thrown and no exception handler available.
ReadOnlyMemoryError()
unknown function (ip: 0x7f9df81cb8f0)
...
Run Code Online (Sandbox Code Playgroud)

如果我尝试在 _wrapper 函数中编译 julia 模块,即:


from multiprocessing import Process
import julia

class JuliaProcess(object):
...

    def _wrapper(self, *args):
        julia.Julia(compiled_modules=False)
        ret = julia.Pkg_jl.func_jl(args)
        self.queue.put(ret) # this is for save the result of the function
    
    def run(self, *args):
        p = Process(target=self._wrapper, args=args)
        self.processes.append(p) # this is for save the process job
        p.start()
...

if __name__ == "__main__":
    ...
    Jlproc = JuliaProcess()
    Jlproc.run(some_args)

Run Code Online (Sandbox Code Playgroud)

我有以下错误:

raise JuliaError(u'Exception \'{}\' occurred while calling julia code:\n{}'
julia.core.JuliaError: Exception 'ReadOnlyMemoryError' occurred while calling julia code:
const PyCall = Base.require(Base.PkgId(Base.UUID("438e738f-606a-5dbb-bf0a-cddfbfd45ab0"), "PyCall"))
...
Run Code Online (Sandbox Code Playgroud)

有谁知道发生了什么事?以及是否可以按照我的建议使用 python 并行化 julia 函数。

Iva*_*hor 1

我终于解决了这个错误。

语法不是问题,而是 Julia 包预编译的实例有问题。

在第一个代码中,错误出现在调用[Jl]中:

julia.Julia(compiled_modules=False)
Run Code Online (Sandbox Code Playgroud)

就在 Julia 导入之前。

第二个代码工作正常,因为表达式 [Jl] 是在目标进程中预编译的。

下面,我分享一个示例,如果您已正确安装 Julia 和 PyCall,则该示例可以正常工作。

#!/usr/bin/env python3
# coding=utf-8

from multiprocessing import Process, Queue
import julia

class JuliaProcess(object):
    def __init__(self):
        self.processes = []
        self.queue = Queue()

    def _wrapper(self, *args):
        julia.Julia(compiled_modules=False)
        from julia import LinearAlgebra as LA
        ret = LA.dot(args[0],args[1])
        self.queue.put(ret) # this is for save the result of the function

    def run(self, *args):
        p = Process(target=self._wrapper, args=args)
        self.processes.append(p) # this is for save the process job
        p.start()

    def wait(self):
        self.rets = []
    
        for p in self.processes:
            ret = self.queue.get()
            self.rets.append(ret)

        for p in self.processes:
            p.join()

if __name__ == "__main__":
    jp = JuliaProcess()
    jp.run([1,5,6],[1,3,2])
    jp.wait()
    print(jp.rets)
Run Code Online (Sandbox Code Playgroud)