I need to do some data processing in a highly parallel manner and want to track how many of it was done.
For that, I am using pmap and sending some message over UDP to signal that a single sample was processed (to send it to statsd to show it in grafana).
But sending something over UDP in pmap causes segfault:
minimal working code is here:
@everywhere using DrWatson
@everywhere @quickactivate
@everywhere using Sockets
@everywhere function make_client(ip, port, prefix)
sock = UDPSocket()
Base.bind(sock, ip, 0)
Sockets.setopt(sock, enable_broadcast=1)
(data)->send(sock, ip, port, string("$prefix.$data"))
end
@everywhere incr(c, metric) = count(c, metric, 1)
@everywhere count(c, metric,value) = c(string(metric,":",value,"|c"))
@everywhere client = make_client(IPv4(127, 0, 0, 1), 8125, "some.prefix.for.grafana")
for i in 1:20
sleep(0.1)
incr(client, "success")
@info "sent to statsd, beep"
end
# this is not working for some reason
pmap(1:20) do i
sleep(0.1) # there be a function for processing the data
incr(client, "success_pmap")
@info "sent to statsd, beep"
end
@info "done everything"
Iām running it as julia -p 10 <name of script>
and while the first, non-distributed loop runs ok, the pmap crashes with this:
From worker 6:
From worker 6: signal (11): Segmentation fault
From worker 6: in expression starting at none:0
From worker 6: uv__udp_check_before_send at /workspace/srcdir/libuv/src/uv-common.c:364
From worker 6: uv_udp_send at /workspace/srcdir/libuv/src/uv-common.c:400
From worker 6: jl_udp_send at /buildworker/worker/package_linux64/build/src/jl_uv.c:738
From worker 6: _send_async at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Sockets/src/Sockets.jl:414
From worker 6: send at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Sockets/src/Sockets.jl:434
From worker 6: #3 at /home/matej.racinsky/projects/SkunkAV/scripts/try_statsd.jl:9 [inlined]
From worker 6: count at /home/matej.racinsky/projects/SkunkAV/scripts/try_statsd.jl:13
From worker 6: unknown function (ip: 0x7fc1c43115cd)
From worker 6: _jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2136 [inlined]
From worker 6: jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2300
From worker 6: incr at /home/matej.racinsky/projects/SkunkAV/scripts/try_statsd.jl:12
From worker 6: _jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2136 [inlined]
From worker 6: jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2300
From worker 6: #5 at /home/matej.racinsky/projects/SkunkAV/scripts/try_statsd.jl:30
From worker 6: unknown function (ip: 0x7fc1c4311422)
From worker 6: _jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2136 [inlined]
From worker 6: jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2300
From worker 6: jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1631 [inlined]
From worker 6: jl_f__apply at /buildworker/worker/package_linux64/build/src/builtins.c:627
From worker 6: #108 at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Distributed/src/process_messages.jl:294
From worker 6: run_work_thunk at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Distributed/src/process_messages.jl:79
From worker 6: macro expansion at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Distributed/src/process_messages.jl:294 [inlined]
From worker 6: #107 at ./task.jl:333
and the same function for every worker.
Is there any reason why this happens?