насколько стековый Python может быть быстрым для параллелизма?

StackOverflow https://stackoverflow.com/questions/1854278

Вопрос

Бесстековый Python не очень хорошо использовал многоядерность, так какой смысл в том, что он должен быть быстрее, чем поток/многопроцессорность Python?

все тесты используют тасклет Python без стека для сравнения с блокировкой потока и очередью Python, это несправедливо, потому что блокировка всегда имеет низкую эффективность

посмотрите, если использовать однопоточный вызов функции без lock, он должен быть таким же эффективным, как Python без стека

Это было полезно?

Решение

Сосредоточьтесь в первую очередь на функциональности, а затем на производительности (если только вы не уверены, что у вас есть в этом необходимость).

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

Если запросы к серверу требуют интенсивного использования ЦП, то наличие родительского процесса (независимо от того, многопоточный он или нет) и соответствующих дочерних процессов имеет смысл.

Если вы действительно хотите масштабироваться, вы можете посмотреть на другую платформу, например Erlang.Если вы действительно хотите масштабировать и по-прежнему использовать Python, вы можете рассмотреть распределенный erlang с процессами Python, управляемыми как порты Erlang в распределенном кластере.

Много вариантов, но если вы не имеете дело с чем-то большой большой, вы, скорее всего, могли бы применить простой подход.

выпускайте раньше, выпускайте часто.

Другие советы

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

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

Существуют и другие библиотеки для выполнения того же самого с помощью разных инструментов, например.Twisted и Tornado на Python.Вы даже можете запустить гибридный Twisted на Stackless Python и так далее.

Бит цикла ввода-вывода напрямую связан с тем, как сокеты Berkley выполняют асинхронный ввод-вывод, и с небольшими усилиями его можно расширить, чтобы он был проактивным, а не реактивным, и работал как с файловыми системами, так и с сетевыми сокетами, например.новейшее libevent.

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

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

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

И есть другие языки, которые основаны на том же подходе с другими дополнительными целями и ограничениями, например.Эрланг, node.js, Clojure, Go.

Из них Clojure, пожалуй, самый информативный.Когда вы поймете, как работает Clojure, и продумаете почему, все цели и ограничения других систем встанут на свои места...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top