> On 25 Sep 2017, at 10:23, Trevör Anne Denise via swift-evolution
> <[email protected]> wrote:
>
>
>> Le 24 sept. 2017 à 12:00, Jean-Daniel <[email protected]
>> <mailto:[email protected]>> a écrit :
>>
>>
>>
>>> Le 23 sept. 2017 à 12:23, Trevör Anne Denise via swift-evolution
>>> <[email protected] <mailto:[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.
>> }
>
>
> 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
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution