π¨ "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
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()
}
}
}
Copyright (c) 2023 Paul Tsochantaris. Licensed under the MIT License, see LICENSE for details.