首页 > 解决方案 > 在线程上从 Python 调用 Julia

问题描述

我一直在尝试从 Python 调用 Julia 函数,这些函数在我尝试从线程调用之前一切正常。为了说明,这里有一个简短的例子:

朱莉娅代码:

function add(x, y)
    return x + y
end

Python代码:

import threading
import time
import julia
from julia import Main     # Move these two lines to add_numbers_from_julia() to call from thread
Main.include('library.jl') # ..but it will only work *once* :|

def add_numbers_from_julia():
    z = Main.add(4, 5)
    print(f"result = {z}")

def main():
    i = -1
    while i != 0:
        print("Options:")
        print("0 - Exit")
        print("1 - Add 4 and 5")
        print("2 - Add 4 and 5 from thread")

        i = int(input())

        if i == 1:
            add_numbers_from_julia()
        elif i == 2:
            thread = threading.Thread(target = add_numbers_from_julia, args = ())
            thread.start()
            time.sleep(5)
        print()
            

if __name__ == "__main__":
    main()

在上面的代码中,如果用户选择 option 1,我们在当前线程上调用 Juliaadd(x,y)函数,一切正常。

如果用户选择2我们尝试add(x,y)从线程调用的选项,这会导致访问冲突。如果我们从文件顶部删除from julia import MainMain.include('library.jl')行并将它们放入add_numbers_from_julia()函数中,那么我们可以成功调用add(x,y) 但只能调用一次。尝试2再次点击将导致另一个访问冲突。

有人可以告诉我出了什么问题,如果我想从线程中调用 Julia 代码,我应该在哪里导入它?

许多 TIA

标签: pythonmultithreadingjulia

解决方案


这是一个有趣的讨论(独立于 python): https ://discourse.julialang.org/t/embedding-julia-into-multithreading-apps/20122/21

特别是 yuyichao 的这一部分解释了您所看到的问题:

julia 不支持多次初始化和最终确定,因此请确保在程序的生命周期内不要多次构造该类。

据我了解,您宁愿使用长期存在的“计算”线程并在该线程中仅调用一次“from julia import Main”。您可以使用queues将数据发送到此计算线程。


推荐阅读