【QA】在GCD中控制并发数

来源:互联网 发布:js 取消严格模式 编辑:程序博客网 时间:2024/04/19 09:08

首先感谢下热心观众,回复了若干个问题,没办法一一解答(有的我也不知道额- -)请见谅。


今天回复下@陈作君同学的提问:

dispatch_concurrent_queue怎么像nsoperationqueue一样控制其中任务的并发数


没理解错的话,应该指 NSOperationQueue 中的

maxConcurrentOperationCount 属性,它可以控制最大并发的 operation 数,但 GCD 的并行队列里貌似没有 API 来控制它。


随后我去翻了下,暂时也没找到某个直接的 API 能干这个事,但可以通过信号量的方式实现这个需求。


我们用global queue这个并发的queue做测试,假设有下面的代码:




运行的结果是这样的:



由于GCD内置的最大并发数(也就是它的线程池容量)在64个的样子,所以小于这个数的并发请求都是能同时start的。而且,我们不应该(貌似也不能)去更改GCD对自己线程池的维护方式。所以,若我们想实现并发数为3,可以在block进入queue之前就“拦一下”



上面的代码简单的利用了信号量将通过这个方法执行的block并发数维持在3个,刚才的测试代码换成这个函数后:




运行结果:



在同一时刻就最多有3个线程在干活儿了。希望题主是这个意思- -


刚才这个dispatch_async_limit_3只是测试用,真的要用在工程里的时候还是要注意,dispatch_semaphore_wait方法在等待信号量时是会卡住当前线程的,谁也不想调用它的时候很可能被卡住(尤其是主线程),所以更好的方案是将信号量等待的操作放在另一个串行线程中:



大概就是这样了

0 0
原创粉丝点击