微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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,wo​​rker 没有解决问题。我必须删除“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 举报,一经查实,本站将立刻删除。