只有两个任务在异步调度队列中并发运行

时间:2017-01-17 20:22:13

标签: ios swift multithreading asynchronous concurrency

我正在尝试运行三个并发任务,每个任务大约需要30秒。但是只有两个会在同一时间运行,第三个任务会在它开始之前等待其中一个完成。

我目前的代码:

func sliderMoved(_ label : UILabel, openCharacteristicNum : Int, closeCharacteristicNum : Int, sender: UISlider, sliderTimer:Timer){

    //run this on a background thread
    DispatchQueue.global(qos: .utility).async {
        var actuatorPosition = self.getActuatorPosition(label)

        if (actuatorPosition < sender.value) {
            // stop closing (if it was) and start opening
            self.writeValue(closeCharacteristicNum, value: 1, withResponse: false)
            self.writeValue(openCharacteristicNum, value: 0, withResponse: false)

            while actuatorPosition < senderValue && sliderTimer.isValid{
                actuatorPosition = self.getActuatorPosition(label)
            }
            // stop opening
            self.writeValue(openCharacteristicNum, value: 1, withResponse: false)
        }
    }
}

我还尝试创建并发队列并在该队列中运行三个任务,但仍然只有两个并发运行。我也尝试过创建三个独立的并发队列并在每个队列中运行一个任务,但仍然遇到同样的问题。

我唯一的猜测是,我正在达到iOS允许应用程序使用的硬线程限制,因为每个任务完全阻止线程直到完成。

2 个答案:

答案 0 :(得分:1)

多核iOS设备只有2核,每个核心有1个线程,所以限制一次是2个线程。唯一的例外是拥有3核的iPad Air 2。

编辑: 这已不再是这种情况。自A10以来,它已经有2个大核心和2个或4个小核心。据我所知,Apple的A系列仍然只支持每个核心一个硬件线程。也就是说,libDispatch将为您管理线程池,它应为其运行的iOS设备选择最佳线程数,可用的硬件线程数是一个您不应该担心的低级细节。使用libDispatch。

答案 1 :(得分:0)

  

但仍有同样的问题

除了没有&#34;问题&#34;这里。

  

我唯一的猜测是,我遇到iOS允许应用程序使用的硬线程限制,因为每个任务完全阻止线程直到完成

我不会将其描述为“艰难的”#34;限制,但可能有限制。然而,重点是没有任何保证,所以你不应该有这样或那样的期望。 GCD的重点在于您关注队列并允许内核按照自己的意愿分配线程。而这正是它正在做的事情。您在队列上安排了操作,并最终执行了这些操作。别担心,快乐。