Swift - 运行 1000 个异步任务,每 50 个后有一个卧铺 - 如何通信 btw DispatchGroups
Swift - Run 1000 async tasks with a sleeper after every 50 - how to communicate btw DispatchGroups
我必须 运行 1000 次异步计算。由于 API 的限制为 50 requests/min 我必须将其分成 50 个块,并在处理一次块后等待一分钟。最后我想打印结果。
resultsArray = [Double]()
// chunked is an extension
points.chunked(into: 50).forEach { pointsChunk in
pointsChunk.forEach { pointsPair
// this function is async
service.calculate(pointsPair) { result in
resultsArray.append(result)
}
}
// wait for a minute before continuing with the next chunk
}
// after all 1000 calculations are done, print result
print(resultsArray)
我确实尝试使用 DispatchGroup
找到解决方案,但在如何合并计时器方面遇到了困难:
let queue = DispatchQueue(label: "MyQueue", attributes: .concurrent)
let chunkGroup = DispatchGroup()
let workGroup = DispatchGroup()
points.chunked(into: 50).forEach { pointsChunk in
chunkGroup.enter()
pointsChunk.forEach { routePointsPair in
workGroup.enter()
// do something async and in the callback:
workGroup.leave()
}
workGroup.notify(queue: queue) {
do { sleep(60) }
chunkGroup.leave()
}
}
chunkGroup.notify(queue: .main) {
print(resultArray)
}
这只是一次执行所有块,而不是延迟 60 秒。
我在类似情况下实现的是手动挂起和恢复我的串行队列。
我的队列参考:
public static let serialQueue = DispatchQueue(label: "com.queue.MyProvider.Serial")
func serialQueue() -> DispatchQueue {
return MyProvider.serialQueue
}
挂起队列:
func suspendSerialQueue() -> Void {
self.serialQueue().suspend()
}
延迟后恢复队列:
func resumeSerialQueueAfterDelay(seconds: Double) -> Void {
DispatchQueue.global(qos: .userInitiated).asyncAfter(deadline: .now() + seconds) {
self.serialQueue().resume()
}
}
这样我就可以完全控制何时暂停和恢复队列,我可以在更长的时间内平均分配许多 API 呼叫。
self.serialQueue().async {
self.suspendSerialQueue()
// API call completion block {
self.resumeSerialQueueAfterDelay(seconds: delay)
}
}
不确定这是否是您要找的,但也许您可以根据您的需要调整我的示例。
我必须 运行 1000 次异步计算。由于 API 的限制为 50 requests/min 我必须将其分成 50 个块,并在处理一次块后等待一分钟。最后我想打印结果。
resultsArray = [Double]()
// chunked is an extension
points.chunked(into: 50).forEach { pointsChunk in
pointsChunk.forEach { pointsPair
// this function is async
service.calculate(pointsPair) { result in
resultsArray.append(result)
}
}
// wait for a minute before continuing with the next chunk
}
// after all 1000 calculations are done, print result
print(resultsArray)
我确实尝试使用 DispatchGroup
找到解决方案,但在如何合并计时器方面遇到了困难:
let queue = DispatchQueue(label: "MyQueue", attributes: .concurrent)
let chunkGroup = DispatchGroup()
let workGroup = DispatchGroup()
points.chunked(into: 50).forEach { pointsChunk in
chunkGroup.enter()
pointsChunk.forEach { routePointsPair in
workGroup.enter()
// do something async and in the callback:
workGroup.leave()
}
workGroup.notify(queue: queue) {
do { sleep(60) }
chunkGroup.leave()
}
}
chunkGroup.notify(queue: .main) {
print(resultArray)
}
这只是一次执行所有块,而不是延迟 60 秒。
我在类似情况下实现的是手动挂起和恢复我的串行队列。
我的队列参考:
public static let serialQueue = DispatchQueue(label: "com.queue.MyProvider.Serial")
func serialQueue() -> DispatchQueue {
return MyProvider.serialQueue
}
挂起队列:
func suspendSerialQueue() -> Void {
self.serialQueue().suspend()
}
延迟后恢复队列:
func resumeSerialQueueAfterDelay(seconds: Double) -> Void {
DispatchQueue.global(qos: .userInitiated).asyncAfter(deadline: .now() + seconds) {
self.serialQueue().resume()
}
}
这样我就可以完全控制何时暂停和恢复队列,我可以在更长的时间内平均分配许多 API 呼叫。
self.serialQueue().async {
self.suspendSerialQueue()
// API call completion block {
self.resumeSerialQueueAfterDelay(seconds: delay)
}
}
不确定这是否是您要找的,但也许您可以根据您的需要调整我的示例。