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 函数。
我终于解决了这个错误。
语法不是问题,而是 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)