Skip to content

An elementary counting semaphore for async tasks in Swift

License

Notifications You must be signed in to change notification settings

ptsochantaris/semalot

Repository files navigation

Logo

Semalot

👨 "Semalot!" 👨‍🦱 "Semalot!!" 👴 "Semalot!!!" 🤦‍♀️ "It's only a counter…" 👨👨‍🦱👴 "Shh!!!!"

An elementary counting semaphore for async tasks in Swift, which I use a lot in my code so I thought I should turn it into a package!

Currently used in

Detailed docs can be found here

Overview

Does what it says on the tin. It's simple and efficient, does not use any dispatch locks, and does not cause any Task queue congestion.

let maxConcurrentOperations = Semalot(tickets: 3)

try await withThrowingTaskGroup { group in
    for request in lotsOfRequests {
        await maxConcurrentOperations.takeTicket()
        group.addTask {
            let data = try await urlSession.data(for: request).0
            await doThings(with: data)
            maxConcurrentOperations.returnTicket()
        }
    }
}

License

Copyright (c) 2023 Paul Tsochantaris. Licensed under the MIT License, see LICENSE for details.