Каково различие между многопоточностью Движения и Потоками Java или pthread?

Вы инстанцируете нового LINQ к объекту SQL DataContext для каждой операции, или Вы, возможно, совместно используете тот же статический контекст для всех своих вызовов? Я первоначально попробовал последний подход, и от того, что я помню, он вызвал нежелательную привязку DB. Я теперь создаю новый контекст для каждой атомарной операции.

32
задан Frank 16 November 2009 в 01:33
поделиться

3 ответа

Цитируется из Учебник 3-го дня <- прочтите это для получения дополнительной информации.

Горутины мультиплексируются по мере необходимости на системные потоки. Когда горутина выполняет системный вызов блокировки, нет другая горутина заблокирована.

Мы сделаем то же самое для CPU-ограниченного горутины в какой-то момент, но пока если вам нужен параллелизм на уровне пользователя, вы необходимо установить $ GOMAXPROCS. или позвоните по телефону runtime.GOMAXPROCS (n).

Горутина не обязательно соответствует потоку ОС. Он может иметь меньший начальный размер стека, и стек будет увеличиваться по мере необходимости.

При необходимости несколько горутинов могут быть мультиплексированы в один поток.

Что еще более важно, концепция изложена выше, что горутины - это последовательная программа, которая может блокировать себя, но не блокирует другие горутины.

реализован как pthreads в gccgo, поэтому он также может быть идентичен потоку ОС. Он разделяет концепцию потока ОС и наше представление о многопоточности при программировании.

24
ответ дан 27 November 2019 в 20:41
поделиться

IMO, что делает многопоточность в Go привлекательной, так это средства связи: в отличие от pthread, где нужно создавать инфраструктуру связи (мьютекс, очереди и т. Д.), В Go она доступна по умолчанию. в удобной форме.

Короче говоря, существует «низкое трение» при использовании потоков из-за хороших средств связи (сродни Erlang, если можно так сказать).

13
ответ дан 27 November 2019 в 20:41
поделиться

В эталонных компиляторах (5g / 6g / 8g) главный планировщик ( src / pkg / runtime / proc.c ) создает N потоков ОС, где N контролируется средой выполнения. GOMAXPROCS (n) (по умолчанию 1). Каждый поток планировщика извлекает новую горутину из главного списка и запускает ее. Горутины будут продолжать работать до тех пор, пока не будет выполнен системный вызов (например, printf) или не будет выполнена операция на канале, после чего планировщик захватит следующую горутину и запустит ее с той точки, на которой она остановилась (см. gosched () вызывает в src / pkg / runtime / chan.c ).

Планирование, для всех намерений и целей реализуется с помощью сопрограмм . Та же самая функциональность может быть написана на прямом C с использованием setjmp () и longjmp (), Go (и другие языки, реализующие легкие / зеленые потоки) просто автоматизируют процесс для вас.

Преимущество облегченных потоков заключается в том, что поскольку это все пользовательское пространство, создание «потока» очень дешево (выделение небольшого стека по умолчанию) и может быть очень эффективным из-за внутренней структуры того, как потоки общаются друг с другом. Обратной стороной является то, что они не являются настоящими потоками, что означает, что один легкий поток может заблокировать всю программу, даже если кажется, что все потоки должны выполняться одновременно.

Та же самая функциональность может быть написана на прямом C с использованием setjmp () и longjmp (), Go (и другие языки, реализующие легкие / зеленые потоки) просто автоматизируют процесс для вас.

Преимущество облегченных потоков заключается в том, что поскольку это все пользовательское пространство, создание «потока» очень дешево (выделение небольшого стека по умолчанию) и может быть очень эффективным из-за внутренней структуры того, как потоки общаются друг с другом. Обратной стороной является то, что они не являются настоящими потоками, что означает, что один легкий поток может заблокировать всю программу, даже если кажется, что все потоки должны выполняться одновременно.

Та же самая функциональность может быть написана на прямом C с использованием setjmp () и longjmp (), Go (и другие языки, реализующие легкие / зеленые потоки) просто автоматизируют процесс для вас.

Преимущество облегченных потоков заключается в том, что поскольку это все пользовательское пространство, создание «потока» очень дешево (выделение небольшого стека по умолчанию) и может быть очень эффективным из-за внутренней структуры того, как потоки взаимодействуют друг с другом. Обратной стороной является то, что они не являются настоящими потоками, что означает, что один легкий поток может заблокировать всю программу, даже если кажется, что все потоки должны выполняться одновременно.

это очень дешево (выделение небольшого стека по умолчанию) и может быть очень эффективным из-за внутренней структуры того, как потоки общаются друг с другом. Обратной стороной является то, что они не являются настоящими потоками, что означает, что один легкий поток может заблокировать всю программу, даже если кажется, что все потоки должны выполняться одновременно.

это очень дешево (выделение небольшого стека по умолчанию) и может быть очень эффективным из-за внутренней структуры того, как потоки общаются друг с другом. Обратной стороной является то, что они не являются настоящими потоками, что означает, что один легкий поток может заблокировать всю программу, даже если кажется, что все потоки должны выполняться одновременно.

14
ответ дан 27 November 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: