关于IOS全局队列,这是一个很好的想法,我们可以使用它来按子线程利用多核CPU,但现在我的问题是,这些子线程从队列中调度出来后,如何管理它们?苹果似乎没有提供这样的API。
例如,我创建了一个串行队列,对于由于某种原因导致一个作业被阻塞的情况,整个队列也将被阻塞。实际上我们想要管理这个工作,目前似乎没有找到测试方法。
任何讨论都将不胜感激,提前谢谢。
发布于 2012-09-09 12:36:20
一旦一个块被分派到一个队列,它就会执行。没有API可以阻止它。
您可以对队列执行suspend
操作,这将导致挂起的块在队列恢复之前不会执行。但是,没有办法停止块。
传统的方法是在你的代码中有一个“检查”,看看运行的代码块是否应该提前停止。
// return early from block
if (shouldStop) return;
请注意,您所看到的“问题”是串行队列的确切定义。它只允许操作按照提交到队列的顺序进行处理。你必须等待你前面的任务完成。
您还可以查看NSOperationQueue
,它提供了一种更简单的机制来取消在队列中等待的块,但停止正在执行的块的唯一方法是在您的块中实现该机制。
如果你发现你不得不取消很多“阻塞”块,那么你的设计很可能是有缺陷的,你需要重新审视你的设计。
此外,如果“落后于”正在等待的任务确实不需要等待该任务,那么为什么要将它们放在串行队列中呢?使用并发队列,或单独的串行队列,或一些其他机制。
现在,让我来说明一下,您确实不应该使用分派队列来阻塞I/O操作。你可以做到这一点,而且这通常是最简单的,但如果你想让你的应用程序具有最佳的性能特征,你应该使用dispatch_io
,它可以更好地与其他CPU密集型线程集成。
我猜想这里最大的收获应该是,而不是试图得到诸如“当当前运行的块被阻塞时,我如何在串行队列上运行块”之类的问题的答案。您应该问问自己,如何才能更好地设计您的应用程序,从而避免出现这种情况。
如果工作不需要执行,那么就不要等待它。如果必须完成这项工作,你只需等待...
发布于 2012-09-09 14:41:15
如果您需要更好地控制后台队列,而不是使用GCD和全局队列,请查看NSOperationQueue
,它提供了一个cancelAllOperations
方法。我假设您使用全局队列是因为您希望并发后台任务,在这种情况下,您可以查看NSOperationQueue
的setMaxConcurrentOperationCount
,它允许您将队列定义为并发的。
有关操作队列的更多详细信息,请参阅Concurrency Programming Guide。
发布于 2015-12-14 23:59:16
我认为您需要的是为您的任务创建自己的队列,并使其并发,并根据需要设置优先级。这样你的任务就不会被阻塞了。
let queueAttr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_CONCURRENT, QOS_CLASS_USER_INITIATED, 0)
let callbackQueue = dispatch_queue_create("myqueue", queueAttr)
https://stackoverflow.com/questions/12339046
复制