【问题标题】:pyjulia and multithreading corrupt the *.pyc file?pyjulia 和多线程损坏 *.pyc 文件?
【发布时间】:2023-03-25 00:41:01
【问题描述】:

这是我的设置: 我正在使用 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,wo​​rker并没有解决问题。我必须删除“mymodule.pyc”并重新启动,然后计算再次运行......一次......第二次再次出现错误。

有什么不同的数据?我有一个我计算一些东西的碎片池。我们称它们为 a,b,c,d,....

所以如果我为 abc 运行 calc,就可以了。第二次为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 也不起作用)

【问题讨论】:

    标签: python julia dataframes.jl


    【解决方案1】:

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

    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

    【讨论】:

    • 感谢您的回答,但如果我设置 os.environ["JULIA_NUM_THREADS"] = str(1),它可以正常工作。所以我认为必须与多处理有关系。此外,我为什么要删除 *pyc 让它再次工作?
    • 您似乎没有在任何地方使用多处理。当您增加线程数时,您的 Julia 代码很可能会做一些不同的事情。不看代码就无法说出更多信息,但我的建议可能是调试的良好第一步。
    • 我发现了错误。在这种情况下,对数据帧的推送同时来自两个进程(同时使用多处理)。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 你能把你的解释说得更详细一点,并举例说明你为解决问题所做的工作吗?实际上,遇到相同问题的人很难通过阅读您的答案来知道该怎么做。
    • 我试过了,但我没有一个小例子。
    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 2018-12-26
    • 2021-04-28
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    相关资源
    最近更新 更多