Ios 将同步/异步与串行/并发队列混合时,调度程序如何工作?

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

在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 concurrentQueue =
dispatch_queue_create("com.matteogobbi.dispex.concurrent_queue", DISPATCH_QUEUE_CONCURRENT);
因此,我们可以从第一个实验开始,使用串行队列和all
dispatch\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");