# @sync @async with non-loop counter

**URL:** <https://discourse.julialang.org/t/sync-async-with-non-loop-counter/9801>\
**Category:** General Usage\
**Created:** [March 18, 2018, 10:40pm UTC](https://discourse.julialang.org/t/sync-async-with-non-loop-counter/9801 "2018-03-18T22:40:39Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![iwelch](https://avatars.discourse-cdn.com/v4/letter/i/8c91f0/32.png) [@iwelch](https://discourse.julialang.org/u/iwelch)\
**Post date:** [March 18, 2018, 10:40pm UTC](https://discourse.julialang.org/t/sync-async-with-non-loop-counter/9801/1 "2018-03-18T22:40:39Z")

</div>

```julia
function paralleloop( f::Function, NC::Int=4 )
    z = SharedArray{Float64}( NC )

    k=0
    @sync for i=1:NC
        k+=1
        # z[k]= f( k ) # works
        # @async z[i]= f( i ) # works
        @async z[k]= f( k ) # fails
    end#for

    convert(Vector{Float64}, z) ## release sharedarray
end#function

@everywhere function sleepingworker(i::Int); sleep(rand()); println("Worker $i"); i^2; end#function

srand(0);
println( paralleloop( sleepingworker ))

```

I want to run the sleeper asynchronously, and then wait with @sync until we are done.

but the above code produces only Worker 4 launches.

```julia
julia understand.jl
Worker 4
Worker 4
Worker 4
Worker 4
[0.0, 0.0, 0.0, 16.0]

```

is this due to @sync macro trickery and one can only follow the documented construct (i.e., using the loop counter i), or do I misunderstand this fundamentally? does i have to be a specific part of the @async? at the moment of my async call, the second loop counter k was properly set. if I use async without understanding why the k is not used as I think it should be, I bet that I will have a deep bug sooner or later while using it.

also, using a for loop with i is not always natural. For example,

```julia
@everywhere function sleepingworker(i::Int); sleep(rand()); println("Worker $i"); i^2; end#function

z = SharedArray{Float64}( 3 )
k=0
@sync begin
    k=3; @async z[k]= sleepingworker( k )
    k=1; @async z[k]= sleepingworker( k ) ## could be a different function
    k=2; @async z[k]= sleepingworker( k )
end#for
display(z)

```

I know what is happening, but not why. all three asyncs are just queued until they encounter end#for, and then start working, picking up the final k at that point. (but this did not happen when the loop counter i was used.)

is this the correct way of starting a few asynch processes and wait-ing for completion of all?

advice appreciated, as always.
