gpt4 book ai didi

ios - 暂停串行队列

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:27:48 27 4
gpt4 key购买 nike

今天我尝试了以下代码:

- (void)suspendTest {
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_CONCURRENT, QOS_CLASS_BACKGROUND, 0);
dispatch_queue_t suspendableQueue = dispatch_queue_create("test", attr);
for (int i = 0; i <= 10000; i++) {
dispatch_async(suspendableQueue, ^{
NSLog(@"%d", i);
});
if (i == 5000) {
dispatch_suspend(suspendableQueue);
}
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"Show must go on!");
dispatch_resume(suspendableQueue);
});
}

代码启动了 10001 个任务,但它应该暂停队列中途运行新任务以在 6 秒内恢复。这段代码按预期工作 - 执行了 5000 个任务,然后队列停止,并在 6 秒后恢复。但是,如果我使用串行队列而不是并发队列,则行为对我来说并不清楚。

dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_BACKGROUND, 0);

在这种情况下,随机数量的任务设法在挂起之前执行,但通常这个数字接近于零(挂起发生在任何任务之前)。问题是 - 为什么串行队列和并发队列的挂起工作方式不同以及如何正确挂起串行队列?

最佳答案

顾名思义,串行队列按顺序执行任务,即仅在前一个任务完成后才开始执行下一个任务。优先级为后台,因此当当前队列达到第 5000 个任务并挂起队列时,它甚至可能还没有启动第一个任务。

来自dispatch_suspend的文档:

The suspension occurs after completion of any blocks running at the time of the call.

即,它不 promise 队列中异步调度的任务会完成,只是任何当前正在运行的任务( block )不会中途挂起。在串行队列上最多有一个任务可以“当前正在运行”,而在并发队列上没有指定的上限。 编辑:根据您对一百万个任务的测试,并发队列似乎保持了“完全并发”的概念抽象,因此即使它们实际上不是。

要在第 5000 个任务之后暂停它,您可以从第 5000 个任务本身触发它。 (那么你可能还想从挂起的时候开始resume-timer,否则理论上可能在挂起之前就永远不会resume了。)

关于ios - 暂停串行队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40184693/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com