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