Как Python без стека может быть быстрым для параллелизма? - PullRequest
2 голосов
/ 06 декабря 2009

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

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

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

Ответы [ 2 ]

2 голосов
/ 06 декабря 2009

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

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

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

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

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

выпускают досрочно, часто выпускают.

0 голосов
/ 19 ноября 2010

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

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

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

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

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

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

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

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

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

...