> Le 23 sept. 2017 à 12:23, Trevör Anne Denise via swift-evolution
> <[email protected]> a écrit :
>
>
>> Le 20 sept. 2017 à 21:15, Jean-Daniel <[email protected]
>> <mailto:[email protected]>> a écrit :
>>
>>
>>
>>> Le 20 sept. 2017 à 08:36, Trevör Anne Denise via swift-evolution
>>> <[email protected] <mailto:[email protected]>> a écrit :
>>>
>>>>
>>>> Le 18 sept. 2017 à 18:07, Pierre Habouzit <[email protected]
>>>> <mailto:[email protected]>> a écrit :
>>>>
>>>>
>>>> -Pierre
>>>>
>>>>> On Sep 18, 2017, at 2:04 AM, Trevör Anne Denise
>>>>> <[email protected] <mailto:[email protected]>>
>>>>> wrote:
>>>>>
>>>>>>
>>>>>> Le 18 sept. 2017 à 07:57, Pierre Habouzit <[email protected]
>>>>>> <mailto:[email protected]>> a écrit :
>>>>>>
>>>>>>> On Sep 17, 2017, at 3:52 AM, Trevör ANNE DENISE via swift-evolution
>>>>>>> <[email protected] <mailto:[email protected]>> 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.
}
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution