如果我使用多个dispatch_async会发生什么

时间:2016-07-21 09:35:00

标签: ios objective-c swift grand-central-dispatch

需要在文档目录中解压缩10个文件,因为我使用像这样的调度异步

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,   0), ^{
 // unzip 5 files

})
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// unzip another 5 files

})

我怀疑它会同时进行解压缩吗?

如果是这样,前5个文件解压缩,另外5个文件也是如此  同时解压缩?

我怎样才能有效地做到这一点?

任何帮助都会很明显。

3 个答案:

答案 0 :(得分:0)

如果你解压缩总文件就会很好。因为它是异步的。如果你尝试做其他后台进程同时进行后台操作,那就会出问题。

  

DISPATCH_QUEUE_PRIORITY_HIGH分派给队列的项目将以高优先级运行,即队列将被安排在任何默认优先级或低优先级队列之前执行。

     

如果要运行单个独立的排队操作而不关心其他并发操作,可以使用全局并发队列

dispatch_queue_t globalConcurrentQueue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
  

它在后台线程上异步运行。这样做是因为解析数据可能是一项耗时的任务,并且它可能会阻止主线程停止所有动画并且应用程序无法响应。

Grand Central Dispatch

dispatch_async

Asynchronous Operations

Apple Document

UI and main Thread

GLobal Queue

dispatch_sync and dispatch_async Process

答案 1 :(得分:0)

因为全局队列是并发队列,所以第二个dispatch_async将与第一个队列同时发生。如果这样做,您必须确保:

  • 解压缩类/实例是线程安全的;
  • 所有型号更新必须为synchronized;和
  • 同步zip操作导致的峰值内存使用率不会太高。

如果不满足上述条件(即,如果要连续运行这些zip任务,而不是同时运行),则可以创建用于解压缩的串行队列(使用dispatch_queue_create)。这样,分派到该队列的任何解压缩任务将在后台队列上串行执行,从而阻止它们同时运行。

答案 2 :(得分:0)

调用dispatch_get_global_queue返回由OS管理的并发后台队列(即,能够在后台线程上一次运行队列项以上的队列)。操作的并发性实际上取决于设备具有的核心数量。

传递给dispatch_async的每个块都是一个队列项,因此当该块出列并运行时,块中的代码将在后台线程上线性运行。例如,如果你使用for循环解压缩,那么:

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
     for (int i = 0; i<5; i++) {
        // Unzip here
     }

}) 

然后任务运行时间为5 x文件解压缩时间。将它们分成两组5可能意味着总解压缩时间减半。

如果您希望所有10个文件都解压缩并具有最大并发性(即系统允许的并发性),那么您最好将10个块分配给global_queue,如下所示:

for (int i = 0; i<5; i++) {

       dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

        // Unzip here
    }) 
}