Nano Hash - криптовалюты, майнинг, программирование

Одновременное выполнение блоков кода в функции Swift 3 с последующим ожиданием завершения

У меня возникли проблемы с пониманием того, как очереди отправки или обработчики задач работают в swift 3. Моя конкретная проблема: у меня проблемы с производительностью, и я хочу запускать несколько блоков кода параллельно и ждать выхода из функции, пока все блоки не будут завершены. Я попытался просто запустить блоки асинхронно в фоновом режиме, но затем я получаю «попытку использовать xxx во время его мутации», потому что я перечисляю одни и те же массивы или enumerateChildNodes(...), управляемые в асинхронных очередях. Я пытаюсь минимизировать количество узлов SpriteKit, чтобы улучшить частоту кадров. Вот пример блоков кода, которые я хочу запустить параллельно, и они ждут:

  func determinePlatformNodesToUse() {

    // Code Block 1:
    for platform in platformArray {
        addPlatformNode(platform, leftDistance: leftDistance, rightDistance: rightDistance)
    }

    // Also part of Code Block 1:
    // resort the platform nodes to guarantee position sequence
    currentPlatformNodeArray.sort(by: { $0.position.x < $1.position.x })

    // Code Block 2:
    for character in characterArray {
        if character.type == CharacterType.Enemy {
            addCharacterNode(character, leftDistance: leftDistance, rightDistance: rightDistance)
        }
    }

    // Code block 3
    // put all the enemies into an array for update processing will be added in addCharacterNode
    currentMotionEnemyNodeArray.removeAll()

    // Also part of Code block 3
    foregroundNode.enumerateChildNodes(withName: CharacterType.Enemy.rawValue, using: {
        (node, stop) in
        if let enemy = node as? CharacterNode {
            if enemy.motionType != .Stand { // dont use .Stand as they dont have motion
                self.currentMotionEnemyNodeArray.append(enemy)
            }
        }
    })

    // Code Block 4
    for actionSceneObject in actionSceneObjectArray {
        addActionSceneObjectNode(actionSceneObject, leftDistance: leftDistance, rightDistance: rightDistance)
    }

    // At this point, wait until all blocks 1-4 above have finished

    // Run blocks 5 - 8 code in all in parallel

    // wait until blocks 5 - 8 have finished and then leave the function
  }

  • Привет, пожалуйста, дайте мне знать, если ваша проблема решена 26.11.2016

Ответы:


1

Вы можете добиться того, что пытаетесь сделать, используя NSOperation. Это можно сделать следующим образом:

func determinePlatformNodesToUse(completion: (_ success: Bool) -> Void) {

    let queue:OperationQueue = OperationQueue()
    queue.name = "com.SOQA.SOQA.name"
    queue.qualityOfService = QualityOfService.default
    queue.maxConcurrentOperationCount = 6

    let operation01:BlockOperation = BlockOperation { 
        // Code Block - 1
    }

    let operation02:BlockOperation = BlockOperation {
        // Code Block - 2
    }

    let operation03:BlockOperation = BlockOperation {
        // Code Block - 3
    }

    let operation04:BlockOperation = BlockOperation {
        // Code Block - 4
    }

    let operation05:BlockOperation = BlockOperation {
        // Code Block - 5
    }

    let operation06:BlockOperation = BlockOperation {
        // Code Block - 6
    }

    let operation07:BlockOperation = BlockOperation {
        // Code Block - 7
    }

    let operation08:BlockOperation = BlockOperation {
        // Code Block - 8
    }

    operation05.addDependency(operation01)
    operation05.addDependency(operation02)
    operation05.addDependency(operation03)
    operation05.addDependency(operation04)

    operation06.addDependency(operation01)
    operation06.addDependency(operation02)
    operation06.addDependency(operation03)
    operation06.addDependency(operation04)

    operation07.addDependency(operation01)
    operation07.addDependency(operation02)
    operation07.addDependency(operation03)
    operation07.addDependency(operation04)

    operation08.addDependency(operation01)
    operation08.addDependency(operation02)
    operation08.addDependency(operation03)
    operation08.addDependency(operation04)

    queue.addOperations([operation01, operation02, operation03, operation04, operation05, operation06, operation07, operation08], waitUntilFinished: true)
}

Не стесняйтесь комментировать, если у вас есть какие-либо сомнения в использовании этого примера. Не стесняйтесь предлагать изменения, чтобы сделать это лучше :)

24.11.2016
  • Этот подход отлично работает в первый раз, но во второй раз я получаю исключение мутации. Эта очередь работает в основном потоке? В противном случае я думаю, что функция обновления вызывается снова, пока очередь все еще работает. *** Завершение работы приложения из-за необработанного исключения «NSGenericException», причина: «*** Коллекция ‹__NSArrayM: 0x17405bcc0› была видоизменена при перечислении». *** Стек вызовов первого броска: 26.11.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..