python - 在线程上从 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 Main
和Main.include('library.jl')
行并将它们放入add_numbers_from_julia()
函数中,那么我们可以成功调用add(x,y)
但只能调用一次。尝试2
再次点击将导致另一个访问冲突。
有人可以告诉我出了什么问题,如果我想从线程中调用 Julia 代码,我应该在哪里导入它?
许多 TIA
解决方案
这是一个有趣的讨论(独立于 python): https ://discourse.julialang.org/t/embedding-julia-into-multithreading-apps/20122/21
特别是 yuyichao 的这一部分解释了您所看到的问题:
julia 不支持多次初始化和最终确定,因此请确保在程序的生命周期内不要多次构造该类。
据我了解,您宁愿使用长期存在的“计算”线程并在该线程中仅调用一次“from julia import Main”。您可以使用queues
将数据发送到此计算线程。
推荐阅读
- python - 在 pandas.series 上的 if 语句并将结果附加到列表
- xml - xpath:前缀必须解析为命名空间
- javascript - 如何在javascript中将日期格式从dd.mm.yyyy转换为dd/mm/yyyy
- javascript - 在ReactJS中清除会话存储和本地存储后仍然出现输入字段值
- python - 在熊猫数据框中按带有分号分隔值的列分组
- ruby-on-rails - 使用活动存储播种图像
- typo3 - 错字3 8.7.x tx_news 7.0.5 用新闻标题覆盖默认元标记标题
- ios - 如何在选择 tableView 的行单元格时显示视图控制器(作为集合视图单元格)?
- php - Wordpress 按标签过滤帖子
- mongodb - MongoDB将两个数组内的值相乘