Ios 将同步/异步与串行/并发队列混合时,调度程序如何工作?
在Grand Central Dispatch中,调度器如何处理不同队列(Ios 将同步/异步与串行/并发队列混合时,调度程序如何工作?,ios,asynchronous,queue,sync,grand-central-dispatch,Ios,Asynchronous,Queue,Sync,Grand Central Dispatch,在Grand Central Dispatch中,调度器如何处理不同队列(串行和并发)使用dispatch\u sync功能和dispatch\u async功能时?首先,我们需要两种类型的队列:一种串行和一种并发: dispatch_queue_t serialQueue = dispatch_queue_create("com.matteogobbi.dispex.serial_queue", DISPATCH_QUEUE_SERIAL); dispatch_queue_t concurr
串行
和并发
)使用dispatch\u sync
功能和dispatch\u async
功能时?首先,我们需要两种类型的队列:一种串行和一种并发:
dispatch_queue_t serialQueue =
dispatch_queue_create("com.matteogobbi.dispex.serial_queue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t concurrentQueue =
dispatch_queue_create("com.matteogobbi.dispex.concurrent_queue", DISPATCH_QUEUE_CONCURRENT);
因此,我们可以从第一个实验开始,使用串行队列和alldispatch\u async
函数将我们的块添加到队列中:
/* Dispatch async with serial queue */
NSLog(@"\n\nDISPATCH: Async - QUEUE: Serial");
NSLog(@"block 1 added");
dispatch_async(serialQueue, ^{
NSLog(@"block 1");
});
NSLog(@"block 2 added");
dispatch_async(serialQueue, ^{
NSLog(@"block 2");
});
NSLog(@"block 3 added");
dispatch_async(serialQueue, ^{
NSLog(@"block 3");
});
NSLog(@"block 4 added");
dispatch_async(serialQueue, ^{
NSLog(@"block 4");
});
NSLog(@"block 5 added");
dispatch_async(serialQueue, ^{
NSLog(@"block 5");
});
NSLog(@"block 6 added");
dispatch_async(serialQueue, ^{
NSLog(@"block 6");
});
NSLog(@"block 7 added");
dispatch_async(serialQueue, ^{
NSLog(@"block 7");
});
NSLog(@"block 8 added");
dispatch_async(serialQueue, ^{
NSLog(@"block 8");
});
NSLog(@"block 9 added");
dispatch_async(serialQueue, ^{
NSLog(@"block 9");
});
NSLog(@"block 10 added");
dispatch_async(serialQueue, ^{
NSLog(@"block 10");
});
NSLog(@"ALL BLOCK ADDED TO THE QUEUE --> FUNCTION RETURNED");
调度:异步-队列:串行
2014-04-08 14:43:16.468添加了dispex[4346:60b]区块1
2014-04-08 14:43:16.468添加了dispex[4346:60b]区块2
2014-04-08 14:43:16.468分配[4346:1303]区块1
2014-04-08 14:43:16.469分配[4346:1303]区块2
2014-04-08 14:43:16.468添加了dispex[4346:60b]块3
2014-04-08 14:43:16.469分配[4346:1303]区块3
2014-04-08 14:43:16.469添加了dispex[4346:60b]区块4
2014-04-08 14:43:16.469分配[4346:1303]区块4
2014-04-08 14:43:16.469添加了dispex[4346:60b]块5
2014-04-08 14:43:16.470添加了dispex[4346:60b]区块6
2014-04-08 14:43:16.470分散剂[4346:1303]第5区
2014-04-08 14:43:16.471添加了dispex[4346:60b]块7
2014-04-08 14:43:16.471分配[4346:1303]区块6
2014-04-08 14:43:16.471分配[4346:1303]第7区
2014-04-08 14:43:16.471添加了dispex[4346:60b]块8
2014-04-08 14:43:16.471分配[4346:1303]第8区
2014-04-08 14:43:16.471添加了dispex[4346:60b]第9区
2014-04-08 14:43:16.472添加了dispex[4346:60b]块10
2014-04-08 14:43:16.472分配[4346:1303]第9区
2014-04-08 14:43:16.472分配[4346:1303]区块10
2014-04-08 14:43:16.472分配[4346:60b]所有添加到队列中的块
-->返回的函数
如您所见,块被添加到队列中,但与此同时,调度程序开始执行它们。这是dispatcher\u async
函数的一个特征,即在队列中添加块,而不等待它们完成执行。换句话说,如果在函数中使用dispatch\u async
,函数将立即返回,同时块正在执行。这是非常有用的!在本例中,我使用NSLog报告何时将块添加到队列中,因此这会降低执行速度并导致日志
已添加所有块
最后。但正如我们将在后面看到的,如果没有日志,它将在开始时写入。由于我们使用的是串行队列,所以按照添加的顺序执行块
下一步:
调度:同步-队列:串行
2014-04-08 14:43:16.473添加了dispex[4346:60b]区块1
2014-04-08 14:43:16.474分配[4346:60b]区块1
2014-04-08 14:43:16.474添加了dispex[4346:60b]区块2
2014-04-08 14:43:16.474分配[4346:60b]区块2
2014-04-08 14:43:16.475添加了dispex[4346:60b]块3
2014-04-08 14:43:16.475分配[4346:60b]块3
2014-04-08 14:43:16.475添加了dispex[4346:60b]块4
2014-04-08 14:43:16.475分配[4346:60b]块4
2014-04-08 14:43:16.476添加了dispex[4346:60b]块5
2014-04-08 14:43:16.476分配[4346:60b]第5区
2014-04-08 14:43:16.476添加了dispex[4346:60b]块6
2014-04-08 14:43:16.477分散剂[4346:60b]第6区
2014-04-08 14:43:16.477添加了分散[4346:60b]块7
2014-04-08 14:43:16.477分配[4346:60b]第7区
2014-04-08 14:43:16.477添加了dispex[4346:60b]块8
2014-04-08 14:43:16.478分配[4346:60b]第8区
2014-04-08 14:43:16.478添加了dispex[4346:60b]第9区
2014-04-08 14:43:16.478分配[4346:60b]第9区
2014-04-08 14:43:16.479添加了dispex[4346:60b]块10
2014-04-08 14:43:16.479分配[4346:60b]区块10
2014-04-08 14:43:16.479分配[4346:60b]所有添加到队列中的块
-->返回的函数
在本例中,我们使用带有串行队列的dispatch\u sync
函数。很容易看出,当上一个块完成执行时,所有的块都被添加了。这是dispatch\u sync
的一个特征。换句话说,直到要执行的块完成,函数才返回。由于这是一个串行队列,因此这里的顺序也受到尊重
下一步:
调度:异步-队列:并发
2014-04-08 14:43:16.480分散[4346:60b]所有添加到队列中的块
-->返回的函数
2014-04-08 14:43:16.480分配[4346:1303]区块1
2014-04-08 14:43:16.480分配[4346:3503]区块2
2014-04-08 14:43:16.480分配[4346:3603]块3
2014-04-08 14:43:16.480分配[4346:3803]第5区
2014-04-08 14:43:16.480分配[4346:3703]区块4
2014-04-08 14:43:16.480分配[4346:3903]区块6
2014-04-08 14:43:16.480分配[4346:3a03]区块7
2014-04-08 14:43:16.480分配[4346:3b03]块8
2014-04-08 14:43:16.482分配[4346:1303]第9区
2014-04-08 14:43:16.483分配[4346:3503]区块10
2014-04-08 14:43:16.483分配[4346:3803]区块12
2014-04-08 14:43:16.483分配[4346:3703]第13区
2014-04-08 14:43:16.483分配[4346:3903]块14
2014-04-08 14:43:16.483分配[4346:3603]区块11
正如我之前所说,这里我展示了如何使用异步调度
但使用并发队列工作。
这真的很有趣,因为没有NSLog来显示何时添加块,您可以看到如何添加所有块
/* Just wait before begin with the next test */
dispatch_group_wait(group_async_serial, DISPATCH_TIME_FOREVER);
/* Dispatch sync with serial queue */
NSLog(@"\n\nDISPATCH: Sync - QUEUE: Serial");
NSLog(@"block 1 added");
dispatch_sync(serialQueue, ^{
NSLog(@"block 1");
});
NSLog(@"block 2 added");
dispatch_sync(serialQueue, ^{
NSLog(@"block 2");
});
NSLog(@"block 3 added");
dispatch_sync(serialQueue, ^{
NSLog(@"block 3");
});
NSLog(@"block 4 added");
dispatch_sync(serialQueue, ^{
NSLog(@"block 4");
});
NSLog(@"block 5 added");
dispatch_sync(serialQueue, ^{
NSLog(@"block 5");
});
NSLog(@"block 6 added");
dispatch_sync(serialQueue, ^{
NSLog(@"block 6");
});
NSLog(@"block 7 added");
dispatch_sync(serialQueue, ^{
NSLog(@"block 7");
});
NSLog(@"block 8 added");
dispatch_sync(serialQueue, ^{
NSLog(@"block 8");
});
NSLog(@"block 9 added");
dispatch_sync(serialQueue, ^{
NSLog(@"block 9");
});
NSLog(@"block 10 added");
dispatch_sync(serialQueue, ^{
NSLog(@"block 10");
});
NSLog(@"ALL BLOCK ADDED TO THE QUEUE --> FUNCTION RETURNED");
/* Dispatch async with concurrent queue */
NSLog(@"\n\nDISPATCH: Async - QUEUE: Concurrent");
dispatch_group_t group_async_concurrent = dispatch_group_create();
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 1");
});
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 2");
});
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 3");
});
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 4");
});
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 5");
});
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 6");
});
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 7");
});
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 8");
});
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 9");
});
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 10");
});
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 11");
});
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 12");
});
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 13");
});
dispatch_group_async(group_async_concurrent, concurrentQueue, ^{
NSLog(@"block 14");
});
NSLog(@"ALL BLOCK ADDED TO THE QUEUE --> FUNCTION RETURNED");
/* Just wait before begin with the next test */
dispatch_group_wait(group_async_concurrent, DISPATCH_TIME_FOREVER);
/* Dispatch sync with concurrent queue */
NSLog(@"\n\nDISPATCH: Sync - QUEUE: Concurrent");
NSLog(@"block 1 added");
dispatch_sync(concurrentQueue, ^{
NSLog(@"block 1");
});
NSLog(@"block 2 added");
dispatch_sync(concurrentQueue, ^{
NSLog(@"block 2");
});
NSLog(@"block 3 added");
dispatch_sync(concurrentQueue, ^{
NSLog(@"block 3");
});
NSLog(@"block 4 added");
dispatch_sync(concurrentQueue, ^{
NSLog(@"block 4");
});
NSLog(@"block 5 added");
dispatch_sync(concurrentQueue, ^{
NSLog(@"block 5");
});
NSLog(@"block 6 added");
dispatch_sync(concurrentQueue, ^{
NSLog(@"block 6");
});
NSLog(@"block 7 added");
dispatch_sync(concurrentQueue, ^{
NSLog(@"block 7");
});
NSLog(@"block 8 added");
dispatch_sync(concurrentQueue, ^{
NSLog(@"block 8");
});
NSLog(@"block 9 added");
dispatch_sync(concurrentQueue, ^{
NSLog(@"block 9");
});
NSLog(@"block 10 added");
dispatch_sync(concurrentQueue, ^{
NSLog(@"block 10");
});
NSLog(@"ALL BLOCK ADDED TO THE QUEUE --> FUNCTION RETURNED");