限制线程数

Limiting number of threads

我需要通过后台线程下载图片,但是限制了线程数。最大线程数必须为 5,并且每个线程中必须只有一个串行队列。对于使用套接字火箭库的客户端服务器。主要的麻烦是我不需要像取消操作这样的 NSOperation 加号。寻找一个简单的决定,但只能找到这样的东西:

self.limitingSema = dispatch_semaphore_create(kOperationLimit);
    dispatch_queue_t concurentQueue = dispatch_queue_create("limiting queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(concurentQueue, ^{
        dispatch_semaphore_wait(self.limitingSema, DISPATCH_TIME_FOREVER);

        /* upload image here */

        dispatch_semaphore_signal(self.limitingSema);
    });

但是如何限制线程数并等待新操作开始,直到它们未在队列中准备好?

控制队列数量好不好?

NSArray *queues = @[dispatch_queue_create("com.YOU.binaryQueue_1", DISPATCH_QUEUE_SERIAL),
                    dispatch_queue_create("com.YOU.binaryQueue_2", DISPATCH_QUEUE_SERIAL),
                    dispatch_queue_create("com.YOU.binaryQueue_3", DISPATCH_QUEUE_SERIAL)
                    ];

NSUInteger randQueue = arc4random() % [queues count];
dispatch_async([queues objectAtIndex:randQueue], ^{
    NSLog(@"Do something");
});
randQueue = arc4random() % [queues count];
dispatch_async([queues objectAtIndex:randQueue], ^{
    NSLog(@"Do something else");
});

GCD 没有限制并发块数量的选项运行ning。

这可能会创建一个线程,它只等待您入队的每个操作。 GCD 动态调整它使用的线程数。如果您将另一个块排入队列并且 GCD 没有更多可用线程,它会在发现有空闲 CPU 个核心可用时启动另一个线程。由于工作线程在您的块内休眠,因此 CPU 被认为是空闲的。这将导致许多线程使用大量内存 - 每个线程获得 512 KB 的堆栈。

您最好的选择是为此使用 NSOperationQueue,因为您可以使用 maxConcurrentOperationCount 属性 直接控制并行操作的数量 运行。这将更容易(编写、测试和调试的代码更少)并且效率更高。