JuliaParallel/Dagger.jl

`@spawn` has confusing move semantics

Open

#357 opened on Sep 9, 2022

View on GitHub
 (8 comments) (0 reactions) (1 assignee)Julia (86 forks)batch import
documentationeager apienhancementhelp wanted

Repository metrics

Stars
 (706 stars)
PR merge metrics
 (Avg merge 12d 5h) (4 merged PRs in 30d)

Description

Note that

◖◗ Dagger.@spawn single=2 println(myid())
EagerThunk (running)

◖◗       From worker 2:        1
◖◗

◖◗ Dagger.spawn(() -> println(myid()), single=2)
EagerThunk (running)

◖◗       From worker 2:        2

I think what's happening here is that in the former case it is evaluating myid() on process 1 and the function executed on worker 2 is just println(1).

This seems like a problem, it's hard to guess that these examples would be different. I suggest that @spawn should match spawn so that its arguments can be read as if it were the function body passed to spawn. Otherwise I think it will need a lot of documentation.

A stronger argument might be that Distributed.@spawnat already works as I'm suggesting:

◖◗ @spawnat 2 println(myid());

◖◗       From worker 2:        2

(My suggestion is clearly badly breaking at least in principle, so this is tricky.)

Contributor guide