Оқыту
Модуль
Узнайте больше о параллелизме, одной из самых уникальных возможностей в Go.
Бұл браузерге бұдан былай қолдау көрсетілмейді.
Соңғы мүмкіндіктерді, қауіпсіздік жаңартуларын және техникалық қолдауды пайдалану үшін Microsoft Edge браузеріне жаңартыңыз.
В этом документе описывается роль контекстов в среде выполнения параллелизма. Поток, подключенный к планировщику, называется контекстом выполнения или просто контекстом. Функция параллелизма::wait и класс concurrency::Context позволяют управлять поведением контекстов. Используйте функцию wait
для приостановки текущего контекста в течение указанного времени. Context
Используйте класс, когда требуется больше контроля над тем, когда контексты блокируют, разблокируют и дают, или когда требуется перезаписать текущий контекст.
Шайпұл
Среда выполнения с параллелизмом предоставляет планировщик по умолчанию, и таким образом не требуется создавать планировщик в приложении. Так как планировщик задач помогает точно настроить производительность приложений, рекомендуется начать с библиотеки параллельных шаблонов (PPL) или библиотеки асинхронных агентов, если вы не знакомы со средой выполнения параллелизма.
Функция параллелизма::wait совместно дает выполнение текущего контекста для указанного числа миллисекунда. Среда выполнения использует время получения для выполнения других задач. После истечения указанного времени среда выполнения перепланирует контекст для выполнения. Таким образом, wait
функция может приостановить текущий контекст дольше, чем значение, указанное milliseconds
для параметра.
Передача 0 (ноль) для milliseconds
параметра приводит к приостановке текущего контекста до тех пор, пока все другие активные контексты не получат возможность выполнять работу. Это позволяет получить задачу всем другим активным задачам.
Пример, использующий wait
функцию для получения текущего контекста, и таким образом позволяет выполнять другие контексты, см. в разделе "Практическое руководство. Использование групп расписаний для влияния на порядок выполнения".
Класс concurrency::Context предоставляет абстракцию программирования для контекста выполнения и предлагает две важные функции: возможность совместно блокировать, разблокировать и возвращать текущий контекст, а также возможность перезаписывать текущий контекст.
Класс Context
позволяет блокировать или давать текущий контекст выполнения. Блокировка или получение полезны, если текущий контекст не может продолжаться, так как ресурс недоступен.
Метод параллелизма::Context::Block блокирует текущий контекст. Контекст, блокируемый, дает свои ресурсы обработки, чтобы среда выполнения могли выполнять другие задачи. Метод параллелизма::Context::Unblock разблокирует заблокированный контекст. Метод Context::Unblock
должен вызываться из другого контекста, отличного от вызываемого Context::Block
. Среда выполнения создает параллелизм::context_self_unblock если контекст пытается разблокировать себя.
Для совместного блокирования и разблокировки контекста обычно вызывается параллелизм::Context::CurrentContext , чтобы получить указатель на Context
объект, связанный с текущим потоком, и сохранить результат. Затем вызывается Context::Block
метод для блокировки текущего контекста. Позже вызовите Context::Unblock
отдельный контекст, чтобы разблокировать заблокированный контекст.
Необходимо соответствовать каждой паре вызовов и Context::Block
Context::Unblock
. Среда выполнения вызывает параллелизм::context_unblock_unbalanced при Context::Block
последовательном вызове метода Context::Unblock
без соответствующего вызова другого метода. Однако перед вызовом вам не придется Context::Block
вызывать Context::Unblock
. Например, если один контекст вызывается Context::Unblock
Context::Block
перед вызовом другого контекста для одного контекста, этот контекст остается разблокирован.
Метод concurrency::Context::Yield дает выполнение, чтобы среда выполнения могли выполнять другие задачи, а затем перепланировать контекст для выполнения. При вызове Context::Block
метода среда выполнения не перепланируется контекст.
Пример, использующий Context::Block
Context::Unblock
методы и Context::Yield
методы для реализации совместного класса семафора, см. в разделе "Практическое руководство. Использование класса Context для реализации кооперативного Семафора".
Планировщик по умолчанию создает то же количество потоков, что и доступные аппаратные потоки. Вы можете использовать oversubscription для создания дополнительных потоков для заданного аппаратного потока.
Для вычислительных операций перезапись обычно не масштабируется, так как она приводит к дополнительным затратам. Однако для задач с высокой задержкой, например считывания данных с диска или из сетевого подключения, перезапись может повысить общую эффективность некоторых приложений.
Ескерім
Разрешать превышение лимита подписки следует только в потоке, созданном средой выполнения с параллелизмом. Oversubscription не влияет на вызов из потока, который не был создан средой выполнения (включая основной поток).
Чтобы включить oversubscription в текущем контексте, вызовите метод параллелизма::Context::Oversubscribe с заданным параметром _BeginOversubscription
true
. При включении oversubscription в потоке, созданном средой выполнения параллелизма, среда выполнения создает один дополнительный поток. После завершения всех задач, требующих перезаписи, вызовите Context::Oversubscribe
параметр с заданным параметром _BeginOversubscription
false
.
Вы можете включить перезаписи несколько раз из текущего контекста, но вы должны отключить его одинаковое количество раз, когда вы включите его. Oversubscription также можно вложить; То есть задача, созданная другой задачей, которая использует oversubscription, также может перезаписывать его контекст. Однако если и вложенная задача, и ее родительский элемент относятся к одному контексту, вызывается только самый внешний вызов, вызывающий Context::Oversubscribe
создание дополнительного потока.
Ескерім
Среда выполнения создает параллелизм::invalid_oversubscribe_operation , если превышение избыточности отключено до включения.
Пример, использующий oversubscription для смещения задержки, вызванной чтением данных из сетевого подключения, см. в статье "Практическое руководство. Использование oversubscription для смещения задержки".
Планировщик заданий
Практическое руководство. Использование групп планирования для определения порядка выполнения
Практическое руководство. Использование класса Context для реализации семафора, поддерживающего параллельный доступ
Практическое руководство. Использование лимита подписки для устранения задержек
Оқыту
Модуль
Узнайте больше о параллелизме, одной из самых уникальных возможностей в Go.