> On Sep 25, 2017, at 3:14 PM, Jean-Daniel via swift-evolution
> <[email protected]> wrote:
>> Le 25 sept. 2017 à 18:54, Trevör Anne Denise via swift-evolution
>> <[email protected] <mailto:[email protected]>> a écrit :
>>
>>>
>>> Le 25 sept. 2017 à 13:33, Trevör ANNE DENISE <[email protected]
>>> <mailto:[email protected]>> a écrit :
>>>
>>>
>>> Le 25 sept. 2017 à 11:55, Thomas <[email protected]
>>> <mailto:[email protected]>> a écrit :
>>>
>>>>
>>>>> On 25 Sep 2017, at 10:23, Trevör Anne Denise via swift-evolution
>>>>> <[email protected] <mailto:[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
>>>>
>>>
>>> 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
This doesn't have to be the case, actually. The intrinsics as Chris described
them wouldn't be sufficient, but you could require a "current queue" to be
provided when kicking off an async function from scratch, as well as any other
"async-local" context information you wanted (e.g. QoS and the other things
that Dispatch tracks with attributes/flags that are generally supposed to
persist across an entire async operation).
John.
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution