Есть множество ответов на это, но это может сбить с толку. Мне нравится думать об этом таким образом, и, может быть, это помогает ?:
Параллельное программирование - это код, который не заботится о порядке выполнения. Java - плохой язык для параллельного программирования, но есть библиотеки и фреймворки, которые могут помочь. JavaScript является отличным языком для параллельного программирования, и часто бывает трудно, когда вы хотите написать что-то, что не является параллельным (например, если вы хотите установить порядок выполнения). Параллельное программирование отлично подходит для программирования, управляемого событиями (где порядок выполнения определяется слушателями событий, например, кодом, выполняющимся в вашем браузере, который действует, когда вы нажимаете кнопку или вводите текст в поле).
Пример может включать создание сотен HTTP-запросов. В NodeJS самое простое решение - открыть все 100 запросов одновременно с помощью метода обратного вызова, а когда ответы возвращаются, метод выполняется каждый раз. Это параллельное программирование. В Ruby самое простое (наиболее распространенное) решение - открыть запрос и обработать ответ, открыть следующий запрос и обработать ответ, и т. Д. Для многих запросов NodeJS проще выполнить своевременно, хотя вам нужно будьте осторожны, чтобы не перегружать сервер и не увеличивать количество исходящих соединений (это легко сделать по ошибке). Вы можете писать Ruby одновременно, но это не так, как написано большинство кода на Ruby, и это немного мешает это делать.
Параллельное программированиеэто код, который может быть запущен одновременно в нескольких потоках или процессах. Это позволяет оптимизировать производительность, выполняя код на нескольких процессорах (часто включая несколько компьютеров, как вы могли бы с чем-то вроде Akka). Поскольку NodeJS не является многопоточным и параллельное выполнение не требуется, вам не нужно беспокоиться о написании многопоточного кода (и большая часть кода JavaScript, который я видел, не является поточно-ориентированным). В Java, хотя язык не делает параллельное программирование нормальным шаблоном, параллельное программирование очень встроено, и вам часто приходится беспокоиться о безопасности потоков. Если вы пишете веб-сайт на Java, обычно это будет выполняться в контейнере, который выполняет каждый запрос в отдельном потоке в той же памяти,
Некоторые из вышеперечисленных зависит от объема и границ, о которых вы говорите. Я работаю на сайтах. Большая часть кода Java, который я вижу, не является параллельным программированием. Конечно, если вы уменьшаете масштаб достаточно, порядок, в котором поступают запросы клиентов, не важен, но если вы увеличиваете масштаб дальше, порядок выполнения вещей определяется кодом. Но код написан так, что запросы могут выполняться параллельно с большим количеством общих объектов, которые должны быть поточно-ориентированными.
Между тем большая часть кода JavaScript, который я вижу, является параллельной: он написан так, что порядок выполнения не важен на многих уровнях. Но он не написан для поддержки параллельного выполнения в разделяемой памяти. Конечно, вы можете выполнять один и тот же код параллельно между несколькими процессами, но объекты не являются общими, поэтому это не параллельное программирование в каком-либо значимом смысле.
Для дополнительного чтения мне очень нравятся иллюстрации в верхнем ответе на этот вопрос здесь: https://www.quora.com/What-are-the-differences-between-parallel-concurrent-and-asynchronous-programming