Confused, такие языки, как python, ruby ​​single threaded? в отличие от java? (для веб-приложений)

Я читал, как Clojure «крут» из-за его синтаксиса + он работает на JVM, поэтому он многопоточен и т. Д. И т. Д.

Есть ли такие языки, как рубин и питон, один в природе? (при работе в качестве веб-приложения).

Каковы основные различия между python / ruby ​​и java, работающими на tomcat?

Разве веб-сервер не имеет пул потоков для работы во всех случаях?

11 Solutions collect form web for “Confused, такие языки, как python, ruby ​​single threaded? в отличие от java? (для веб-приложений)”

Оба Python и Ruby имеют полную поддержку многопоточности. Существуют некоторые реализации (например, CPython, MRI, YARV), которые не могут фактически запускать потоки параллельно, но это ограничение этих конкретных реализаций, а не языка. Это похоже на Java, где также есть некоторые реализации, которые не могут запускать потоки параллельно, но это не означает, что Java является однопоточным.

Обратите внимание, что в обоих случаях существует множество реализаций, которые могут запускать потоки параллельно: PyPy, IronPython, Jython, IronRuby и JRuby являются лишь немногими примерами.

Основное различие между Clojure с одной стороны и Python, Ruby, Java, C #, C ++, C, PHP и почти любым другим основным и не слишком распространенным языком на другой стороне – это то, что Clojure имеет разумную модель параллелизма. На всех других языках используются потоки, которые, как мы знаем, являются плохой моделью параллелизма в течение как минимум 40 лет. Clojure OTOH имеет разумную модель обновления, которая позволяет ей не только представить программисту одно, но фактически множество разумных моделей параллелизма: атомные обновления, транзакционную память программного обеспечения, асинхронные агенты, параллельные глобальные переменные, параллельные параллелизму, фьючерсы, обещания, параллельность потока данных и в будущем возможно даже больше.

Смущенный вопрос с множеством путаных ответов …

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

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

Использование потоков для веб-бэкэндов – плохая идея. Зачем вводить опасности запирания резьбы – запирание, условия гонки, тупики – к чему-то по своей сути смущающей параллели? Гораздо безопаснее убирать каждый бэкэнд в своем изолированном процессе, избегая возможности для всех этих проблем.

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

Большинство языков не определяют одно или многопоточность. Обычно это остается до библиотек для реализации.

При этом некоторые языки лучше, чем другие. CPython, например, имеет проблемы с блокировкой интерпретатора во время многопоточности, Jython (python, запущенный на JVM), нет.

Некоторая реальная сила Clojure (IMO) заключается в том, что она работает на JVM. Вы получаете многопоточность и тонны библиотек бесплатно.

Короткий ответ – да, они однопоточные.

Долгий ответ – это зависит.

JRuby многопоточен и может быть запущен в tomcat, как и другой код Java. MRI (по умолчанию ruby) и Python имеют GIL (Global Interpreter Lock) и, таким образом, однопоточные.

То, как он работает для веб-серверов, еще больше осложняется количеством доступных конфигураций сервера. Для большинства рубиновых приложений есть (по крайней мере) два уровня серверов, прокси-сервер / статический файловый сервер, например nginx, а затем сервер приложений ruby.

Nginx не использует потоки, такие как apache или tomcat, использует неблокирующие события (и я думаю, что разветвленные рабочие процессы). Это позволяет ему иметь дело с более высокими уровнями параллелизма, чем это допускается с накладными расходами и неточностями планирования собственных потоков.

Различные серверы рубиновых приложений также работают по-разному, чтобы получить высокую пропускную способность и параллелизм без потоков. Тонкий использует libev и асинхронную модель, подобную Nginx. Mongrel использует круглый пул рабочих процессов. Unicorn использует собственный Unix IPC (выберите в сокете), чтобы загрузить баланс в пул разветвленных процессов через один мастер-прокси-сокет.

Темы – это только один из способов решения проблемы параллелизма. Несколько процессов и событийных моделей – это другой подход, который хорошо связан с базой Unix. Это принципиально отличается от того, как Java относится к миру.

CPython имеет глобальную блокировку Interpreter, которая может снизить производительность многопоточного кода в Python. В некоторых случаях чистый эффект заключается в том, что потоки не могут выполняться одновременно из-за конкуренции за блокировку. Не все реализации Python используют GIL, поэтому это может не относиться к JPython, IronPython или другим реализациям.

Сам язык поддерживает многопоточность и другие асинхронные операции. Библиотеки python также могут поддерживать потоки внутри, не подвергая их непосредственно интерпретатору Python.

Если вы слышали что-то отрицательное о Python и потоке (или что оно не поддерживает его), вероятно, кто-то сталкивается с ситуацией, когда GIL вызывает узкое место.

Конечно, у веб-сервера будет пул потоков. Это только вне контроля вашей программы. Эти потоки используются для обработки HTTP-запросов. Каждый HTTP-запрос обрабатывается в отдельном потоке, и поток возвращается в пул, когда связанный HTTP-ответ завершен. Если у веб-сервера нет такого пула, он будет очень медленным в обслуживании.

Независимо от того, является ли язык программирования однопоточным или многопоточным, зависит от возможности программно создавать новые потоки с использованием соответствующего языка. Если это невозможно, то язык является односторонним, например PHP. Насколько я могу судить, оба Ruby и Python поддерживают многопоточность.

Несколько интерпретируемых языков программирования, таких как CPython и Ruby, поддерживают потоки, но имеют ограничение, известное как Global Interpreter Lock (GIL). GIL – это блокировка взаимного исключения, которую интерпретирует интерпретатор, который не позволяет интерпретатору одновременно интерпретировать код приложения на двух или более потоках одновременно, что эффективно ограничивает параллелизм в нескольких основных системах.

от wikipedia Thread

Рубин

Ruby Interpreter является однопоточным, то есть несколько его методов не являются потокобезопасными.

В мире Rails этот однопоточный поток в основном переносится на сервер. Итак, вы увидите, что nginx работает с пулом mongrel серверов, каждый из которых имеет интерпретатор в памяти, обрабатывает 1 запрос за раз и в своем потоке.

Пассажирское «рубиновое предприятие» привносит концепцию сбора мусора и некоторую безопасность потоков в Rails, и это приятно.

В Rails все еще предстоит работать, но это происходит медленно, но в целом идея состоит в том, чтобы иметь несколько сервисов и серверов.

Как распутать узлы во всех этих потоках …

Clojure не изобретал потоки, однако он особенно поддерживает его с помощью программной транзакционной памяти, атомов, агентов, операций параллельной карты, …

Все остальные накопили поддержку резьбы. Ruby – это особый случай, поскольку он имеет зеленые потоки в некоторых реализациях, которые являются своего рода программным эмулированным потоком и не используют все ядра. 1.9 остановит это.

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

Подводя итог всем современным языкам, поддерживаем потоки в той или иной форме.

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

Читая эти ответы здесь … Многие из них стараются казаться умнее, чем они действительно являются imho (им в основном говорят о материалах, связанных с Ruby, как о том, с кем я больше всего знаком). Фактически, JRuby в настоящее время является единственной реализацией Ruby, которая поддерживает истинный параллелизм. В потоках JVM Ruby отображаются в собственные потоки ОС, без вмешательства GIL. Поэтому совершенно правильно сказать, что Ruby не многопоточен. В 1.8.x Ruby фактически запускается внутри одного потока ОС, и, хотя у вас есть фальшивое чувство параллелизма с зелеными потоками, в действительности GIL в значительной степени помешает вам иметь истинную параллельность. В Ruby 1.9 это немного изменилось, так как теперь к процессу Ruby может быть прикреплено много потоков ОС (плюс зеленые потоки), но снова GIL полностью уничтожит точку и станет узким местом.

На практике, с обычной точки зрения webapp, это не имеет большого значения, если его однопользовательская или многопоточная. Проблема в основном возникает на стороне сервера, и в основном это вопрос разницы в технике масштабирования.

Да Ruby и Python могут обрабатывать многопоточность, но для многих случаев (web) лучше полагаться на потоки, созданные HTTP-запросами от клиента на сервер. Даже если вы создаете много потоков в одном приложении, чтобы снизить затраты времени исполнения или обрабатывать многие задачи вовремя, в случае веб-приложения, которое обычно слишком много, никто не будет ждать счастливо больше, чем некоторые доли секунды для ответа ваше приложение на одной странице, более разумно использовать методы AJAX (асинхронный JavaScript и XML): убедитесь, что дизайн вашего веб-сайта быстро растет, и сделайте асинхронную вставку этих файлов жесткого кодирования позже.

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

  • Что такое эквивалент «sys.stdout.write ()» в Ruby?
  • Самый простой способ создания сценариев для объединения двух текстовых файлов - Ruby, Python, JavaScript, Java?
  • Онлайн-поиск работы утомительный. Помогите мне автоматизировать его
  • Ruby 2.1.5 и RubyPython 0.6.3-RubyPython :: InvalidInterpreter: указан неверный интерпретатор
  • Как написать программу Perl, Python или Ruby для изменения памяти другого процесса в Windows?
  • Каковы преимущества и недостатки методов импорта и импорта при загрузке?
  • Мониторинг событий в файловой системе по мере их возникновения
  • Base36 Кодировать строку?
  • Могу ли я использовать Ruby и Python вместе?
  • Обновлена ​​(текущая) рекомендация по Rails по сравнению с Django?
  • Как решить проблемы с просмотром кода на языке python и с кодом завершения в vim?
  • Python - лучший язык программирования в мире.