如何使用 juliacall 从 python 多处理池运行多个 julia 函数

v.t*_*ala 5 python julia python-multiprocessing juliacall

我想从 python 中运行 julia 函数/脚本。我设法通过库调用 Julia 脚本juliacall。现在我想并行化它。因此,我创建了一个 python 多处理池并从每个工作人员调用 julia 脚本。但是,这会失败并显示以下消息:

python: /buildworker/worker/package_linux64/build/src/debuginfo.cpp:1634: void register_eh_frames(uint8_t*, size_t): Assertion `end_ip != 0' failed.
Run Code Online (Sandbox Code Playgroud)

我怎样才能进一步调试这个?这是我的最小工作示例:

python: /buildworker/worker/package_linux64/build/src/debuginfo.cpp:1634: void register_eh_frames(uint8_t*, size_t): Assertion `end_ip != 0' failed.
Run Code Online (Sandbox Code Playgroud)

还有朱莉娅剧本test_julia_simple.jl

for i in 1:10
    println(i)
end
1+2
Run Code Online (Sandbox Code Playgroud)

附加信息:

import os
os.environ['PYTHON_JULIAPKG_EXE'] = "/home/user/.juliaup/bin/julia"
os.environ['PYTHON_JULIAPKG_OFFLINE'] = 'yes'
os.environ['PYTHON_JULIAPKG_PROJECT'] = '/home/user/julia/environments/v1.6/'

from juliacall import Main as jl, convert as jlconvert

from multiprocessing import Pool
from tqdm import tqdm

import ipdb

def init_worker():
    import os
    os.environ['PYTHON_JULIAPKG_EXE'] = "/home/user/juliaup/bin/julia"
    os.environ['PYTHON_JULIAPKG_OFFLINE'] = 'yes'
    os.environ['PYTHON_JULIAPKG_PROJECT'] = '/home/user/.julia/environments/v1.6/'

    from juliacall import Main as jl, convert as jlconvert

    print('in init_worker()...')
    jl.seval('using Pkg')
    jl.seval('Pkg.status()')
    print('...done')

def compute(jobid):
    print(f'in main({jobid})...')

    jl.seval('include("test_julia_simple.jl")')
    print('...done')
    return

def main():
    njobs = 10
    #start pool with init_worker() as initializer
    
    with Pool(2, initializer=init_worker) as p, tqdm(total=njobs) as pbar:
        res = []
        for jid in range(njobs):
            res.append(p.apply_async(compute, (jid,)))
        for r in res:
            r.get()
            pbar.update(1)


if __name__ == "__main__":
    main()

Run Code Online (Sandbox Code Playgroud)

不确定这是否相关,但错误消息几乎相同 https://github.com/JuliaLang/julia/issues/44969


经过一番评论后,我尝试使用线程池,但在这种情况下,python 因分段错误而失败:

for i in 1:10
    println(i)
end
1+2
Run Code Online (Sandbox Code Playgroud)