> Le 25 sept. 2017 à 18:54, Trevör Anne Denise via swift-evolution 
> <swift-evolution@swift.org> a écrit :
> 
>> 
>> Le 25 sept. 2017 à 13:33, Trevör ANNE DENISE <trevor.anneden...@icloud.com 
>> <mailto:trevor.anneden...@icloud.com>> a écrit :
>> 
>> 
>> Le 25 sept. 2017 à 11:55, Thomas <tclement...@free.fr 
>> <mailto:tclement...@free.fr>> a écrit :
>> 
>>> 
>>>> On 25 Sep 2017, at 10:23, Trevör Anne Denise via swift-evolution 
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>> 
>>>> 
>>>>> Le 24 sept. 2017 à 12:00, Jean-Daniel <mail...@xenonium.com 
>>>>> <mailto:mail...@xenonium.com>> a écrit :
>>>>> 
>>>>> 
>>>>> 
>>>>>> Le 23 sept. 2017 à 12:23, Trevör Anne Denise via swift-evolution 
>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> a écrit :
>>>>>> 
>>>>>> 
>>>>>>> Le 20 sept. 2017 à 21:15, Jean-Daniel <mail...@xenonium.com 
>>>>>>> <mailto:mail...@xenonium.com>> a écrit :
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>> Le 20 sept. 2017 à 08:36, Trevör Anne Denise via swift-evolution 
>>>>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> a écrit 
>>>>>>>> :
>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> Le 18 sept. 2017 à 18:07, Pierre Habouzit <pie...@habouzit.net 
>>>>>>>>> <mailto:pie...@habouzit.net>> a écrit :
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> -Pierre
>>>>>>>>> 
>>>>>>>>>> On Sep 18, 2017, at 2:04 AM, Trevör Anne Denise 
>>>>>>>>>> <trevor.anneden...@icloud.com <mailto:trevor.anneden...@icloud.com>> 
>>>>>>>>>> wrote:
>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> Le 18 sept. 2017 à 07:57, Pierre Habouzit <pie...@habouzit.net 
>>>>>>>>>>> <mailto:pie...@habouzit.net>> a écrit :
>>>>>>>>>>> 
>>>>>>>>>>>> On Sep 17, 2017, at 3:52 AM, Trevör ANNE DENISE via 
>>>>>>>>>>>> swift-evolution <swift-evolution@swift.org 
>>>>>>>>>>>> <mailto:swift-evolution@swift.org>> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> Hello everyone,
>>>>>>>>>>>> 
>>>>>>>>>>>> I have a few questions about async await in Swift.
>>>>>>>>>>>> 
>>>>>>>>>>>> Say that you have :
>>>>>>>>>>>> 
>>>>>>>>>>>> func foo() async {
>>>>>>>>>>>>    print("Hey")
>>>>>>>>>>>>    await bar()
>>>>>>>>>>>>    print("How are you ?")
>>>>>>>>>>>> }
>>>>>>>>>>>> 
>>>>>>>>>>>> First of all, am I right to say that :
>>>>>>>>>>>> 1) If the bar function wasn't an async function, the thread would 
>>>>>>>>>>>> be blocked until bar returns, at this point print("How are you ?") 
>>>>>>>>>>>> would be executed and its only after that that the function 
>>>>>>>>>>>> calling foo() would get back "control"
>>>>>>>>>>> 
>>>>>>>>>>> I don't think you can quite call await without marking foo() as 
>>>>>>>>>>> async (?).
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> Yes, that's what I meant, case one would call foo() without await if 
>>>>>>>>>> it wasn't async.
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>>> 2) Here (with async bar function), if bar() takes some time to 
>>>>>>>>>>>> execute,
>>>>>>>>>>> 
>>>>>>>>>>> Not quite, `await bar()` is afaict syntactic sugar for:
>>>>>>>>>>> 
>>>>>>>>>>> bar {
>>>>>>>>>>>     printf("How are you ?");
>>>>>>>>>>> }
>>>>>>>>>>> 
>>>>>>>>>>> Where bar used to take a closure before, the compiler is just 
>>>>>>>>>>> making it for you. bar itself will be marked async and will handle 
>>>>>>>>>>> its asynchronous nature e.g. using dispatch or something else 
>>>>>>>>>>> entirely.
>>>>>>>>>>> This has nothing to do with "time".
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> If it's just syntactic sugar then how does this solve this issue 
>>>>>>>>>> mentioned in the concurrency manifesto ?
>>>>>>>>>> "Beyond being syntactically inconvenient, completion handlers are 
>>>>>>>>>> problematic because their syntax suggests that they will be called 
>>>>>>>>>> on the current queue, but that is not always the case. For example, 
>>>>>>>>>> one of the top recommendations on Stack Overflow is to implement 
>>>>>>>>>> your own custom async operations with code like this (Objective-C 
>>>>>>>>>> syntax):"
>>>>>>>>> 
>>>>>>>>> "where" things run is not addressed by async/await afaict, but Actors 
>>>>>>>>> or any library-level usage of it.
>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> So since async await don't have any impact on where things are 
>>>>>>>> executed, what would happen concretely with this code ?
>>>>>>>> 
>>>>>>>> func slowFunction(_ input: [Int]) async -> [Int] {
>>>>>>>>        var results = [Int]()
>>>>>>>>        for element in input {
>>>>>>>>                results += [someLongComputation(with: element)]
>>>>>>>>        }
>>>>>>>>        return results
>>>>>>>> }
>>>>>>>> 
>>>>>>>> beginAsync {
>>>>>>>>        await slowFunction(manyElements)
>>>>>>>> }
>>>>>>>> 
>>>>>>>> I didn't specified anything about which queue/thread runs this code, 
>>>>>>>> so what would happen ? Would beginAsync block until slowFunction 
>>>>>>>> completes ?
>>>>>>>> 
>>>>>>> 
>>>>>>> If I understand correctly, In real code you are not supposed to call 
>>>>>>> beginAsync.
>>>>>>> It should be wrapped by high level frameworks. GCD may provide a method 
>>>>>>> that take an async lambda as parameter and dispatch it on a the global 
>>>>>>> concurrent queue.
>>>>>>> Other library may provide entry point that run the code in a private 
>>>>>>> thread pool.
>>>>>>> 
>>>>>>> This is just a primitive used to support coroutine, but does not define 
>>>>>>> how they are handled.
>>>>>> 
>>>>>> 
>>>>>> Thank you everyone, I understand it better now, I still have some 
>>>>>> questions tough.
>>>>>> Just to be sure that I am understanding this correctly, if you some 
>>>>>> async function and it suspends itself, then your current async function 
>>>>>> making this call will also suspend itself, right ?
>>>>>> 
>>>>>> Also, I understand how suspendAsync will be used to warp current 
>>>>>> callback based functions into async/await friendly functions and in this 
>>>>>> case :
>>>>>> func getStuff() async -> Stuff {
>>>>>>   return await suspendAsync { continuation in
>>>>>>     getStuff(completion: continuation)
>>>>>>   }
>>>>>> }
>>>>>> 
>>>>>> Here, I understand how the function controls where continuation is 
>>>>>> executed, but how would you write an API supporting async/await from 
>>>>>> scratch ?
>>>>>> 
>>>>>> Say that I want to build an async function that downloads data, with 
>>>>>> libdispatch I could do :
>>>>>> func dowloadSomething() {
>>>>>>  await someBackgroundQueue.asyncCorountine()
>>>>>>  // Here I would put my code for downloading data
>>>>>>  
>>>>>>  // But would I have to put anything after that to choose where to 
>>>>>> execute the continuation ? DispatchQueue.main.syncCorountine() maybe ?
>>>>>> }
>>>>> 
>>>>> The high level stuff is not designed yet, and how to specify the 
>>>>> continuation target queue/thread is not defined at this point.
>>>>> 
>>>>> Your code will probably be something like
>>>>> 
>>>>> Dispatch.startAync {
>>>>>   val stuff = await downloadStuff()
>>>>>   // do something with stuff once it is done.
>>>>> }
>>>> 
>>>> 
>>>> Do you mean that the API to execute the continuation back on its original 
>>>> thread ? (avoiding shared mutable state)
>>> 
>>> I think you have to do something like this:
>>> 
>>> func async doSomethingInBackground(callbackQueue: DispatchQueue) -> 
>>> SomeResult {
>>>     await someBackgroundQueue.asyncCorountine()
>>>     
>>>     // Here I would put my (potentially lengthy) background code.
>>>     
>>>     // Jump on the requested callback queue.
>>>     await callbackQueue.asyncCoroutine()
>>>     
>>>     // Return result (if any).
>>>     return result
>>> }
>>> 
>>> 
>>> Thomas
>>> 
>> 
>> I hope this will be handled automatically the compiler tough !
> 
> 
> 
> 
> Did anyone started to sketch a design for how giving back control to the 
> calling queue will work ?
> 
> Would it make any sense to limit asyncCorountine() to the scope of the 
> function where it gets called and implicitly "hop back" to the calling queue 
> so that no shared mutable state issues arise ?

No. Async methods are not require to be dispatched on a queue and all threads 
are not required to have a queue.


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

Reply via email to