Skip to content

UndefVarError when sending a REPL-defined function to workers with @eval @everywhere #58705

Open
@draftman9

Description

@draftman9

Julia Version: 1.10.5+0.x64.linux.gnu (installed by juliaup)
OS/Architecture: Linux x86_64, Ubuntu 22.04

Summary:

Attempting to broadcast a function object defined in the main process's REPL to worker processes using @eval @everywhere f_every = $f results in an UndefVarError: #f not defined on the workers. This suggests an issue with serializing and deserializing a REPL-defined function.

Minimal Working Example (MWE):

using Distributed
addprocs(2)

# Define a function on the main process
f(a) = a

# Attempt to send the function object to all workers
@eval @everywhere f_every = $f

Expected Behavior:

The function f should be successfully serialized, sent to the worker processes, and assigned to the variable f_every on each worker without error.

Actual Behavior:

The command fails with an error on the worker processes:

ERROR: On worker 2:
UndefVarError: `#f` not defined
Stacktrace:
  [1] deserialize_datatype
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:1399
  [2] handle_deserialize
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:867
  [3] deserialize
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:814
  [4] handle_deserialize
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:874
  [5] deserialize
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:814
  [6] deserialize_expr
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:1291
  [7] handle_deserialize
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:894
  [8] deserialize
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:814
  [9] deserialize_expr
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:1291
 [10] handle_deserialize
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:894
 [11] deserialize
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:814
 [12] #5
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:973
 [13] ntupleany
    @ ./ntuple.jl:43
 [14] deserialize_tuple
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:973
 [15] handle_deserialize
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:857
 [16] deserialize
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Serialization/src/Serialization.jl:814 [inlined]
 [17] deserialize_msg
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Distributed/src/messages.jl:87
 [18] #invokelatest#2
    @ ./essentials.jl:892 [inlined]
 [19] invokelatest
    @ ./essentials.jl:889 [inlined]
 [20] message_handler_loop
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Distributed/src/process_messages.jl:176
 [21] process_tcp_streams
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Distributed/src/process_messages.jl:133
 [22] #103
    @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Distributed/src/process_messages.jl:121

...and 1 more exception.

Stacktrace:
 [1] sync_end(c::Channel{Any})
   @ Base ./task.jl:455
 [2] macro expansion
   @ ./task.jl:487 [inlined]
 [3] remotecall_eval(m::Module, procs::Vector{Int64}, ex::Expr)
   @ Distributed /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Distributed/src/macros.jl:219
 [4] top-level scope
   @ /media/Big/replaceC/.julia/juliaup/julia-1.10.5+0.x64.linux.gnu/share/julia/stdlib/v1.10/Distributed/src/macros.jl:203
 [5] eval(m::Module, e::Any)
   @ Core ./boot.jl:385
 [6] top-level scope
   @ REPL[5]:1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions