首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >关于IOS中的全局队列。

关于IOS中的全局队列。
EN

Stack Overflow用户
提问于 2012-09-09 20:25:48
回答 3查看 233关注 0票数 1

关于IOS全局队列,这是一个很好的想法,我们可以使用它来按子线程利用多核CPU,但现在我的问题是,这些子线程从队列中调度出来后,如何管理它们?苹果似乎没有提供这样的API。

例如,我创建了一个串行队列,对于由于某种原因导致一个作业被阻塞的情况,整个队列也将被阻塞。实际上我们想要管理这个工作,目前似乎没有找到测试方法。

任何讨论都将不胜感激,提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-09 20:36:20

一旦一个块被分派到一个队列,它就会执行。没有API可以阻止它。

您可以对队列执行suspend操作,这将导致挂起的块在队列恢复之前不会执行。但是,没有办法停止块。

传统的方法是在你的代码中有一个“检查”,看看运行的代码块是否应该提前停止。

代码语言:javascript
代码运行次数:0
运行
复制
// return early from block
if (shouldStop) return;

请注意,您所看到的“问题”是串行队列的确切定义。它只允许操作按照提交到队列的顺序进行处理。你必须等待你前面的任务完成。

您还可以查看NSOperationQueue,它提供了一种更简单的机制来取消在队列中等待的块,但停止正在执行的块的唯一方法是在您的块中实现该机制。

如果你发现你不得不取消很多“阻塞”块,那么你的设计很可能是有缺陷的,你需要重新审视你的设计。

此外,如果“落后于”正在等待的任务确实不需要等待该任务,那么为什么要将它们放在串行队列中呢?使用并发队列,或单独的串行队列,或一些其他机制。

现在,让我来说明一下,您确实不应该使用分派队列来阻塞I/O操作。你可以做到这一点,而且这通常是最简单的,但如果你想让你的应用程序具有最佳的性能特征,你应该使用dispatch_io,它可以更好地与其他CPU密集型线程集成。

我猜想这里最大的收获应该是,而不是试图得到诸如“当当前运行的块被阻塞时,我如何在串行队列上运行块”之类的问题的答案。您应该问问自己,如何才能更好地设计您的应用程序,从而避免出现这种情况。

如果工作不需要执行,那么就不要等待它。如果必须完成这项工作,你只需等待...

票数 2
EN

Stack Overflow用户

发布于 2012-09-09 22:41:15

如果您需要更好地控制后台队列,而不是使用GCD和全局队列,请查看NSOperationQueue,它提供了一个cancelAllOperations方法。我假设您使用全局队列是因为您希望并发后台任务,在这种情况下,您可以查看NSOperationQueuesetMaxConcurrentOperationCount,它允许您将队列定义为并发的。

有关操作队列的更多详细信息,请参阅Concurrency Programming Guide

票数 0
EN

Stack Overflow用户

发布于 2015-12-15 07:59:16

我认为您需要的是为您的任务创建自己的队列,并使其并发,并根据需要设置优先级。这样你的任务就不会被阻塞了。

代码语言:javascript
代码运行次数:0
运行
复制
let queueAttr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_CONCURRENT, QOS_CLASS_USER_INITIATED, 0)

let callbackQueue = dispatch_queue_create("myqueue", queueAttr)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12339046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档