> On 25 Aug 2017, at 10:14, Thomas via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> 
>> On 25 Aug 2017, at 01:15, Adam Kemp <adam.k...@apple.com 
>> <mailto:adam.k...@apple.com>> wrote:
>> 
>> 
>> 
>>> On Aug 24, 2017, at 3:15 PM, Thomas <tclement...@free.fr 
>>> <mailto:tclement...@free.fr>> wrote:
>>> 
>>> 
>>>> On 24 Aug 2017, at 23:47, Adam Kemp <adam.k...@apple.com 
>>>> <mailto:adam.k...@apple.com>> wrote:
>>>> 
>>>> 
>>>>> On Aug 24, 2017, at 1:05 PM, Thomas via swift-evolution 
>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>> 
>>>>>> 
>>>>>> On 24 Aug 2017, at 21:48, Marc Schlichte <marc.schlic...@googlemail.com 
>>>>>> <mailto:marc.schlic...@googlemail.com>> wrote:
>>>>>> 
>>>>>> Yes, I think it is mandatory that we continue on the callers queue after 
>>>>>> an `await ` on some actor method.
>>>>>> 
>>>>>> If you `await` on a non-actor-method though, you would have to changes 
>>>>>> queues manually if needed.
>>>>>> 
>>>>>> Any `actor` should have a `let actorQueue: DispatchQueue` property so 
>>>>>> that we can call in these cases:
>>>>>> 
>>>>>> ```await actorQueue.asyncCoroutine()``` as mentioned in the manifesto.
>>>>> 
>>>>> Wouldn't that be really confusing though? That awaiting certain methods 
>>>>> would bring us back to the actor's queue but awaiting others would 
>>>>> require manual queue hopping? What if the compiler was to always generate 
>>>>> the 'await actorQueue.asyncCoroutine()' queue hopping code after awaiting 
>>>>> on an async/actor method?
>>>> 
>>>> Yes, it would be confusing. await should either always return to the same 
>>>> queue or never do it. Otherwise it’s even more error-prone. I see the 
>>>> actor feature as being just another demonstration of why solving the 
>>>> queue-hopping problem is important for async/await to be useful.
>>> 
>>> So the way a non "fire and forget" actor method would work is:
>>> 
>>> - the actor's queue is in a suspended state until the method returns, this 
>>> is required so that messages sent to other actor methods are not processed 
>>> (they're added to the queue)
>>> - if the method body awaits on some other code, it automatically jumps back 
>>> on the actor's queue after awaiting, regardless of the queue's suspension 
>>> and content
>>> - when the method returns, the actor's queue is resumed and pending 
>>> messages can be processed (if any)
>>> 
>> 
>> I don’t think await should cause the actor’s queue (or any queue) to be 
>> suspended. Actor methods should not block waiting for asynchronous things. 
>> That’s how you get deadlocks. If an actor method needs to be async then it 
>> should work just like any async method on the main queue: it unblocks the 
>> queue and allows other messages to be processed until it gets an answer.
>> 
>> You do have to be aware of the fact that things can happen in between an 
>> await and the next line of code, but conveniently these places are all 
>> marked for you. They all say “await”. :)
> 
> It is correct that suspending the queue allows for deadlocks, but not doing 
> it means you can receive messages while still in the middle of another 
> message. For the same reason you may need FIFO ordering in a class to 
> guarantee coherency, you will want this to work in an asynchronous world as 
> well. Take for example some storage class:
> 
> 1. store(object, key)
> 2. fetch(key)
> 
> If you're doing these operations in order, you want the fetch to return the 
> object you just stored. If the 'store' needs to await something in its 
> implementation and we were to not suspend the queue, the fetch would be 
> processed before the object is actually stored and it would return something 
> unexpected.

By the way, contrary to what I said earlier, that means we'd need to do this 
also for "fire and forget" methods, as is "store" in this example.

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to