Правильный способ настройки NSStreams?

Я пишу небольшое одноранговое приложение для чата Bluetooth. Что я сейчас делаю:

let thread = Thread(block: { [weak self] in
    guard let `self` = self else { return }

    self.channel.inputStream.delegate = self
    self.channel.inputStream.schedule(in: .current, forMode: .defaultRunLoopMode)
    self.channel.inputStream.open()

    self.channel.outputStream.delegate = self
    self.channel.outputStream.schedule(in: .current, forMode: .defaultRunLoopMode)
    self.channel.outputStream.open()

    RunLoop.current.run()
})

thread.start()

куда self.channel является CBL2CAPChannelПроблема, с которой я сейчас сталкиваюсь, заключается в том, что она генерирует новые потоки для каждой пары каналов, и в конечном итоге слишком много потоков остается вокруг.

Как правильно настроить CBL2CAPChannelв этом случае? Документы Apple используют основной поток для этого, что является неожиданным и может привести к проблемам при большом количестве соединений.

1 ответ

Решение

Документы Apple используют основной поток для этого, что является неожиданным и может привести к проблемам при большом количестве соединений.

Это не неожиданно; это совершенно нормально. Вы не должны создавать отдельные потоки для каждого потока. Весь смысл циклов выполнения состоит в том, чтобы обрабатывать параллелизм без создания новых потоков. В программировании цикла выполнения вы очень редко создаете новые потоки. Программирование цикла выполнения происходит задолго до многоядерных систем и было разработано для совместной многозадачности (а не вытесняющей многозадачности).

Даже если вы хотите перенести вещи на другие ядра, вы никогда не должны создавать Thread объект, если вы не взаимодействуете с кодом C++, который требует этого. Там не было много веских причин для использования NSThread непосредственно в течение почти десятилетия. Вы передаете работу в GCD, используя DispatchQueue. Передача данных из потока в другую очередь диспетчеризации для обработки является очень нормальным подходом, при котором практически вся работа снимается с основной очереди (тогда основная очередь просто выполняет координацию).

Если у вас большое количество соединений, или они очень заняты, то вы можете рассмотреть возможность размещения всех из них в отдельном потоке (не один поток на соединение; всего один поток). Но маловероятно, что при ставках L2CAP вам придется это делать. Я создал приложения для чата Mac для G4s, менее мощные, чем iPhone 5 с одним потоком.

Другие вопросы по тегам