如何解决pyjulia 和多线程破坏了 *.pyc 文件?
这是我的设置: 我正在使用 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
在此之后,计算运行到最后,然后我收到一条非常长的错误消息,并出现堆栈竞争,但没有任何意义,我可以在哪里发现问题。
重启django,worker 没有解决问题。我必须删除“mymodule.pyc”并重新启动,然后计算再次运行......一次......第二次再次出现错误。
有什么不同的数据?我有一堆碎片,我可以在上面计算一些东西。让我们称它们为 a,b,c,d,....
因此,如果我为 abc 运行计算,则可以。第二次来abc,也还好。但是如果我使用 cde 它会抛出错误。 但是 cde 不是问题。如果我将 cde 作为第一个 calc 运行,它会在运行 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 蟒蛇 3.7.9 pyjulia 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,"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!。相反,您可以用要推送的结果替换缺失值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。