欢迎!请查看 关于 页面,了解更多此网站的工作细节。
在 https://github.com/cnuernber/dtype-next/issues/52,我们计划在使用 Clojure 编写的机器学习库时,使 Java、Clojure 和其他非 JVM 语言之间的互操作性更加容易。我们还希望创建一种高效的方法,将数据帧和 ndarrays 传输到 Julia (libjulia-clj) 和 Python (libpython-clj)。
我在这里实现了 Java 与 Clojure 的整合,并取得了一些显著的进展: https://github.com/invesdwin/invesdwin-context/blob/master/invesdwin-context-parent/invesdwin-context-clojure/src/main/java/de/invesdwin/context/clojure/pool/(重现问题的测试用例在同一个项目中)
看起来现在的单线程测试运行良好,但当使用多个线程时,绑定似乎不起作用。据我所知,Clojure 应该使用 threadlocals 用于命名空间变量。但也许我遗漏了一些系统属性来正确地隔离一切?(类似于 jruby 的 org.jruby.embed.localcontext.scope=threadsafe; https://github.com/jruby/jruby/wiki/RedBridge#Context_Instance_Type)
是我在做错什么,还是 Clojure 不支持在并行调用时从多个线程调用,而不会出现命名空间冲突?似乎 Clojure 会将自己绑定到第一个初始化它的线程,任何其他线程都会遇到绑定错误
作为权宜之计,我可以将 Clojure 的交互限制在一个线程中,并通过执行器将脚本执行委托给那个单一的线程。尽管使用 Clojure 的线程局部隔离可以在多个线程中工作将更有效率。
我 通过每个线程使用单独的命名空间找到了一个解决方法:[链接](https://github.com/cnuernber/dtype-next/issues/52#issuecomment-1013685393)
因此,所有测试用例现在都是绿色的。