> On 25 Sep 2017, at 10:23, Trevör Anne Denise via swift-evolution 
> <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

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

Reply via email to