[swift-evolution] [Concurrency] async/await + actors

David Hart david at hartbit.com
Sat Sep 9 18:30:09 CDT 2017


> On 10 Sep 2017, at 00:40, Kenny Leung via swift-evolution <swift-evolution at swift.org> wrote:
> 
> Then isn’t the example functionally equivalent to:
> 
>     func doit() {
>         DispatchQueue.global().async {
>             let dataResource  = loadWebResource("dataprofile.txt")
>             let imageResource = loadWebResource("imagedata.dat")
>             let imageTmp      = decodeImage(dataResource, imageResource)
>             let imageResult   = dewarpAndCleanupImage(imageTmp)
>             DispatchQueue.main.async {
>                 self.imageResult = imageResult
>             }
>         }
>     }
> 
> if all of the API were synchronous? Why wouldn’t we just exhort people to write synchronous API code and continue using libdispatch? What am I missing?

There are probably very good optimisations for going asynchronous, but I’m not the right person for that part of the answer.

But I can give another answer: once we have an async/await pattern, we can build Futures/Promises on top of them and then we can await on multiple asynchronous calls in parallel. But it won’t be a feature of async/await in itself:

func doit() async {
	let dataResource  = Future({ loadWebResource("dataprofile.txt”) })
	let imageResource = Future({ loadWebResource("imagedata.dat”) })
	let imageTmp = await decodeImage(dataResource.get, imageResource.get)
        self.imageResult = await dewarpAndCleanupImage(imageTmp)
}

> -Kenny
> 
> 
>> On Sep 8, 2017, at 2:33 PM, David Hart <david at hartbit.com <mailto:david at hartbit.com>> wrote:
>> 
>> 
>>> On 8 Sep 2017, at 20:34, Kenny Leung via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>> 
>>> Hi All.
>>> 
>>> A point of clarification in this example:
>>> 
>>> func loadWebResource(_ path: String) async -> Resource
>>> func decodeImage(_ r1: Resource, _ r2: Resource) async -> Image
>>> func dewarpAndCleanupImage(_ i : Image) async -> Image
>>> 
>>> func processImageData1() async -> Image {
>>>     let dataResource  = await loadWebResource("dataprofile.txt")
>>>     let imageResource = await loadWebResource("imagedata.dat")
>>>     let imageTmp      = await decodeImage(dataResource, imageResource)
>>>     let imageResult   = await dewarpAndCleanupImage(imageTmp)
>>>     return imageResult
>>> }
>>> 
>>> Do these:
>>> 
>>> await loadWebResource("dataprofile.txt")
>>> await loadWebResource("imagedata.dat")
>>> 
>>> happen in in parallel?
>> 
>> They don’t happen in parallel.
>> 
>>> If so, how can I make the second one wait on the first one? If not, how can I make them go in parallel?
>>> 
>>> Thanks!
>>> 
>>> -Kenny
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170910/d332a2ae/attachment.html>


More information about the swift-evolution mailing list