2017-02-15 4 views
2

Я рассматривал разницу между однопоточной асинхронной обработкой JavaScript и потоковым подходом C# к асинхронной обработке, как описано здесь (Node.js vs Async/await in .net). Мне кажется, что «асинхронное кодирование» может суммировать все «использование потоков» на языке C# или Java. Это так?Threads vs Async на многопоточных языках, таких как C#?

Моего понимание нитей код, который выполняется на 2 отдельных процессорах в то же время, что, насколько я могу видеть, включает в себя:

  1. стреляя отдельные процессы
  2. асинхронной обработки задач, на " Теперь»и„позже“основа
  3. Разбиение задачи на частичные задачи, которые работают в отдельных потоках, а затем суммируют результаты

мне кажется, что точка 2/3 эффективно обрабатывая асинхронный код точно так же логично, как и с JavaScript. Хотя я (думаю, я) понимаю, что существуют различия в терминах «контекст», которые нужно добавить в новый поток? Но похоже, что асинхронный просмотр тезисов, если они не ...)

Помимо того, что я упомянул, в чем отличие от точки зрения разработчика JavaScript с точки зрения обработки асинхронного кода? С моей неопытной точки зрения с C# кажется, что асинхронное кодирование в JavaScript имеет много общего с многопоточным кодированием на C#. Хотя с разными вариантами использования ... Единственное различие, которое я вижу, заключается в том, что код в JavaScript никогда не выполняется одновременно с другой код, в то время как в C# он может - это, откуда берется идея «безопасности потоков»? то есть состояние нити не может быть изменено посредством операций с другим потоком (я думаю) ...

Это правильно? Если нет, то каковы различия?

+3

«Мое понимание потоков - это код, который выполняется на двух отдельных процессорах одновременно» - это неверно. Когда вы выполняете потоки, будь то C# или javascript, все, что вы получаете, - это временное сращивание на процессоре, где процессор будет тратить несколько минут на каждую «нить». 'Parallel.ForEach' в C# нацелен на выполнение задач на разных процессорах. –

+0

Даже для 'Parallel.ForEach', MSDN говорит, что итерации могут выполняться параллельно.« Означает ли это, что когда вы используете потоки в C#, которые вы на самом деле говорите на компьютере, «не потрудитесь попробовать выполнить инструкции по порядку, скорее просто выполняйте как можно эффективнее »? Итак, в этом случае, действительно ли управление потоками полностью заботится об CLR? –

+0

Также: [Нет нитки] (http://blog.stephencleary.com/2013/11/there-is-no-thread.html) – Fildor

ответ

2

Асинхронность и многопоточность являются формами параллелизм:

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

Я смотрел на разнице между однопоточной асинхронной обработкой в ​​JavaScript и ходового подходом С # для асинхронной обработки

Я считаю, что мой ответ на этот вопрос в заблуждении вас немного. Когда я говорю о «асинхронно многопоточном», я имею в виду, что асинхронность существует в многопоточной среде. Я делаю не означает, что асинхронность реализована с использованием многопоточности.

JavaScript (на данный момент) заперт в однопоточной модели (откладывая на данный момент такие вещи, как веб-работники, которые похожи на потоки). Таким образом, асинхронность, естественно, выполняется на одном потоке. Обратите внимание, что чистая асинхронность не требует потока для асинхронной операции; например, когда вы выполняете вызов веб-API, нет потока, который должен сидеть, ожидая ответа, чтобы вернуться. Узел.js (и браузерный JavaScript, если на то пошло) используют аналогичные методы для тех, которые находятся в моем сообщении There Is No Thread, плюс threadpool, чтобы обернуть небольшое количество блокирующих API.

Важно отметить, что асинхронность не требует потока. Это форма параллелизма, которая в принципе может быть беспроблемной. На стороне сервера это обеспечивает большую степень масштабируемости.

JavaScript останавливается на достигнутом, по крайней мере, на данный момент. Node.js достаточно хорошо масштабируется в одном потоке (не считая пула потоков), поскольку он обеспечивает асинхронность. ASP.NET использует другой подход: асинхронность исторически была больна в использовании, поэтому ASP.NET с несколькими потоками сначала, а затем позволяет асинхронный или синхронный код; современные службы могут использовать асинхронность в многопоточной среде для еще большей масштабируемости.

Мне кажется, что «асинхронное кодирование» может суммировать все «используя потоки» на языке, таком как C# или Java. Это так?

Нет. Существует один класс работы, который не подходит для асинхронности: алгоритмы с привязкой к процессору. В этом случае ваша «работа» имеет фактический код процессора, который он должен запускать на реальном CPU. Если вы делаете что-то подобное, вам нужны реальные потоки. В этом случае вам нужно скорее параллелизм, чем асинхронность. Параллелизм медленно приближается к JavaScript, но они начинаются на очень низком уровне, и это будет довольно давно, прежде чем высокоуровневый параллелизм станет жизнеспособным вариантом.

Сторона примечания: код C# может выбрать для запуска асинхронного кода все в одном потоке. Фактически, это среда по умолчанию для клиентских приложений (приложения для пользовательского интерфейса на рабочем столе/мобильном устройстве). Многопоточная асинхронная среда обычно используется только на сервере, например ASP.NET.

Мое понимание нитей код, который выполняется на 2 отдельных процессоров одновременно

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

Мне кажется, что точка 2/3 эффективно обрабатывает асинхронный код точно так же логично, как и с JavaScript.

Да, за исключением того факта, что асинхронный код JavaScript не может быть привязан к ЦП. Например, вы можете использовать параллелизм в .NET для вычисления фрактала; вы не можете сделать это, используя только async/await (независимо от языка).

С моей неопытной точки зрения с C# кажется, что асинхронное кодирование в JavaScript имеет много общего с многопоточным кодированием на C#.

С точки зрения высокого уровня, да: это обе формы параллелизма.

Если вы имеете в виду, что async/await в JavaScript подобен async/await в C#, то да, они практически то же самое. async/await используются для реализации asynchrony на обоих языках.

Хотя с различными вариантами использования ... Единственное различие, которое я вижу, заключается в том, что код в JavaScript никогда не выполняется одновременно с другим кодом, тогда как в C# это может быть - это когда появляется идея «безопасности потоков» из? то есть состояние нити не может быть изменено с помощью операций с другим потоком (я думаю) ...

Да, в любое время, когда у вас многопоточность, вам необходимо обеспечить безопасность потока. Таким образом, любой тип параллельного кода в C# должен гарантировать, что он является потокобезопасным. Асинхронный код в многопоточной среде может также сталкивается с проблемами безопасности потоков, но это более редко (самый асинхронный код является серийным, который не может иметь проблем с безопасностью потока).

+0

Асинхронность и многопоточность могут * потенциально * создавать параллелизм. Ни * обязательно * не создает параллелизм. «многопоточность» не обязательно означает одновременное использование нескольких вещей, а просто * означает использование нескольких потоков. Параллелизм также не является синонимом многопоточности, это синоним параллелизма. – Servy

+2

@Servy: Параллелизм и параллелизм не являются синонимами. –

+0

Параллелизм делает несколько вещей одновременно. Параллелизм делает несколько вещей одновременно. Вы можете добиться параллелизма, хотя одним из них является ряд средств, потоки - асинхронность. – Servy

Смежные вопросы