pyjulia 和多线程破坏了 *.pyc 文件?

pyjulia and multithreading corrupt the *.pyc file?

这是我的设置: 我正在使用 Django 并从 django rq-worker 调用 julia。使用 worker 可以避免线程问题,因为没有其他线程。

在 julia 中,我使用多处理来计算一些奇特的技术 wodooo。只要一切都好。

如果我启动django和worker,我可以计算一次。一切都很好。但是第二次,使用不同的数据,我得到了这个错误。

┌ Error: Error adding value to column :t.
└ @ DataFrames ~/.julia/packages/DataFrames/nxjiD/src/dataframe/dataframe.jl:1644

在此之后,计算 运行s 结束,然后我得到了一个很长的堆栈竞争错误消息,但是没有意义,我可以在哪里发现问题。

重新启动django 和worker 并没有解决问题。我必须删除“mymodule.pyc”并重新启动,然后再次计算 运行s...一次...第二次错误再次出现。

有什么不同的数据?我有一堆棋子,我可以根据这些棋子计算一些东西。我们称它们为 a,b,c,d,....

所以如果我 运行 abc 的计算,它没问题。第二次abc,也还可以。但是如果我使用 cde,它就会抛出错误。 但是 cde 不是问题。如果我 运行 cde 作为第一个计算,它会工作并在 运行ning abc 时崩溃。我希望它不会太混乱。

如何使用 julia 多线程:

import os
from multiprocessing import cpu_count
# read num of cpus and set the julia threas var
os.environ["JULIA_NUM_THREADS"] = str(cpu_count())

#import (py)julia
from julia import Main as jl

#do simething
jl.eval('some code')
jl.include("Main.jl")

我使用的是什么版本: Debian 10.7 python 3.7.9 皮尤利亚0.5.6 茱莉亚 1.6.1 DataFrames:1.1.1(0.21.8 也没有工作)

这似乎与线程无关。 您只是在代码的某处混合了数据类型。看这个例子:

julia> using DataFrames

julia> df = DataFrame(A = String[], B = Int[])
0×2 DataFrame

julia> push!(df, ("hello", 1))
1×2 DataFrame
 Row │ A       B
     │ String  Int64
─────┼───────────────
   1 │ hello       1

julia> push!(df, (1, "hello"))
┌ Error: Error adding value to column :A.

如果由于某种原因您完全无法找到错误,您可以尝试在数据框中扩展类型,例如:

julia> df.A = Vector{Any}(df.A); 

julia> df.B = Vector{Any}(df.B);

julia> push!(df, (1, "hello"))
2×2 DataFrame
 Row │ A      B
     │ Any    Any
─────┼──────────────
   1 │ hello  1
   2 │ 1      hello

这让您有机会了解如何将数据添加到您的 DataFrame

嗯,这个错误源于 julia,而不是 pyjulia。

这只是正常的 julia 行为,因为有些东西不是线程安全的。

https://github.com/JuliaData/DataFrames.jl/issues/2795

直接在 julia 代码中解决这个问题,肯定会消除 pyjulia 和 pyc 文件中的问题。

此问题的解决方法是,在 运行 并行化代码之前用缺失值填充 Dataframe。然后,不要使用 push!。相反,您可以用要推送的结果替换缺失值。