将Julia函数定位到多处理时出错.Python进程



我试图通过使用多处理并行化python代码。以Julia函数为目标的进程。

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


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

但是,当我在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)

Process启动时出现错误,输出如下:

fatal: error thrown and no exception handler available.
ReadOnlyMemoryError()
unknown function (ip: 0x7f9df81cb8f0)
...

如果我尝试在_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)

我有以下错误:

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"))
...

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

我终于解决了这个错误。

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

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

julia.Julia(compiled_modules=False)

在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)

最新更新