【问题标题】:Do non-concurrent nsoperations execute in a serial fashion?非并发 nsoperation 是否以串行方式执行?
【发布时间】:2012-11-15 23:19:32
【问题描述】:

发件人:Apple docs on managing concurrency

NsOperation

编写一个自定义子类并覆盖一个方法:main。当 NSOperationQueue 调度它运行时,调用 main 方法来执行操作。以这种方式编写的 NSOperation 类称为非并发操作,因为开发人员不负责产生线程——多线程全部由超类处理。 (不要被术语混淆:一个操作是非并发的,并不意味着它不能并发执行,它只是意味着你不必自己处理并发。)

我认为覆盖 main 是使用 NSOperation 的最简单方法,但苹果网站说它的非并发是否意味着 nsoperation 队列中的 nsoperations(仅覆盖 main 时)会串行执行?

我不想连续执行我的操作,但我希望以尽可能少的努力让我的操作并行。

【问题讨论】:

    标签: objective-c multithreading parallel-processing nsoperation


    【解决方案1】:

    不,它们不会一定连续运行。正如您引用的段落所指出的,它“并不意味着它不能同时执行”。

    那么是什么决定了它们是否可以并行运行? NSOperationQueue 以及您在操作之间设置的任何依赖项。稍后在同一份文档中,标题为“运行操作”的部分解释说:

    • 您可以指定(限制)队列将产生的线程数,并且
    • “NSOperationQueue 将自动确定它应该产生多少线程。”

    Concurrency Programming Guide 中详细说明:

    在大多数情况下,操作在添加到队列后不久就会执行,但操作队列可能会由于多种原因延迟排队操作的执行。具体来说,如果排队的操作依赖于尚未完成的其他操作,则执行可能会延迟。如果操作队列本身已挂起或已在执行其最大数量的并发操作,也可能会延迟执行。

    您通过使用非并发操作放弃的是操作本身并非旨在设置新线程等。

    【讨论】:

    • 是不是说在非并发的ns操作中,如果我不添加任何依赖,把所有的操作都加入到nsoperation队列中,会不会全部并行运行?
    • 是的,再次限制依赖项和最大限制。从文档中添加了另一个引用来支持。
    • 这意味着:“取决于”。决定不是你的,而是 NSOperationQueue 的 - 基于系统的状态(如可用 CPU 的数量)和其他依赖项已经声明它将或不会并行开始其操作。我认为这是一个很好的解决方案:易于实现,不易出错,不会阻止系统并行运行,但如果这对 NSOperationQueue 来说似乎更好,则允许它串行运行。
    【解决方案2】:

    我不确定,但我正在使用“dispatch_queue_create”来创建并行进程。 假设如果我想同时执行两个功能,我正在使用以下代码。看看能不能帮到你,

    dispatch_queue_t queue = dispatch_queue_create("FirstOperation", 0ul);
    dispatch_async(queue, ^{
    
        //Do your functionality here
    
        dispatch_sync(dispatch_get_main_queue(), ^{
            //Do your UI updates here
        });
    });
    dispatch_release(queue);
    
    
    dispatch_queue_t queue2 = dispatch_queue_create("SecondOperation", 0ul);
    dispatch_async(queue2, ^{
    
        //Do your functionality here
    
        dispatch_sync(dispatch_get_main_queue(), ^{
            //Do your UI updates here
        });
    });
    dispatch_release(queue2);
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2022-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多