我正在尝试使用 Symbolics.jl 来执行并行符号操作,但似乎该包不是线程安全的。
使用以下代码,
Threads.@threads for i in range(1,8)
@variables k
expand(k)
println(i)
end
我得到以下错误
ERROR: LoadError: TaskFailedException
Stacktrace:
[1] wait
@ ./task.jl:345 [inlined]
[2] threading_run(fun::var"#3#threadsfor_fun#2"{var"#3#threadsfor_fun#1#3"{UnitRange{Int64}}}, static::Bool)
@ Base.Threads ./threadingconstructs.jl:38
[3] top-level scope
@ ./threadingconstructs.jl:89
8
nested task error:
One of x or y already in this Bijection
Stacktrace:
[1] error(s::String)
@ Base ./error.jl:35
[2] setindex!(b::Bijections.Bijection{Any, Any}, y::SymbolicUtils.Sym{Real, Base.ImmutableDict{DataType, Any}}, x::DynamicPolynomials.PolyVar{true})
@ Bijections ~/.julia/packages/Bijections/IWrOY/src/Bijections.jl:74
[3] polyize(x::SymbolicUtils.Sym{Real, Base.ImmutableDict{DataType, Any}}, pvar2sym::Bijections.Bijection{Any, Any}, sym2term::Dict{SymbolicUtils.Sym, Any}, vtype::Type, pow::Function, Fs::Type, recurse::Bool)
@ SymbolicUtils ~/.julia/packages/SymbolicUtils/qulQp/src/polyform.jl:178
[4] PolyForm(x::SymbolicUtils.Sym{Real, Base.ImmutableDict{DataType, Any}}, pvar2sym::Bijections.Bijection{Any, Any}, sym2term::Dict{SymbolicUtils.Sym, Any}, vtype::Type; Fs::Type, recurse::Bool, metadata::Base.ImmutableDict{DataType, Any})
@ SymbolicUtils ~/.julia/packages/SymbolicUtils/qulQp/src/polyform.jl:196
[5] expand(expr::SymbolicUtils.Sym{Real, Base.ImmutableDict{DataType, Any}})
@ SymbolicUtils ~/.julia/packages/SymbolicUtils/qulQp/src/polyform.jl:262
[6] expand(n::Num)
@ Symbolics ~/.julia/packages/Symbolics/FGTCH/src/Symbolics.jl:154
[7] macro expansion
@ ~/Documents/cmb_replication/test_example.jl:6 [inlined]
[8] (::var"#3#threadsfor_fun#2"{var"#3#threadsfor_fun#1#3"{UnitRange{Int64}}})(tid::Int64; onethread::Bool)
@ Main ./threadingconstructs.jl:84
[9] #3#threadsfor_fun
@ ./threadingconstructs.jl:51 [inlined]
[10] (::Base.Threads.var"#1#2"{var"#3#threadsfor_fun#2"{var"#3#threadsfor_fun#1#3"{UnitRange{Int64}}}, Int64})()
@ Base.Threads ./threadingconstructs.jl:307
有没有在 Symbolics.jl 中使用锁或其他线程安全工具来允许使用这个包进行并行计算?