Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 23, 2011 23:23:55

XCoder
От:
Зарегистрирован: 2011-10-23
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Особенности организации множества потоков

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

Если не трудно, мне было бы крайне интересно услышать ликбез по этому вопросу от опытной аудитории:

1) Эффективна ли реализация множества потоков с точки зрения потребления памяти
2) Какие особенности работы с потоками (управление)
3) Как на низком уровне реализуются потоки? (в частности, механизм распределения памяти)


P.S. Прошу прощения за вероятную глупость в своем вопросе, но мне хотелось бы уяснить для себя механизмы использования нитей (threads) и дочерних процессов (fork).

C точки зрения быстродействия и вообще целесообразности, в чем преимущество использования нитей? Отсутствие накладных расходов на уровне ОС для fork() основного процесса?




С уважением,
XCoder.



Отредактировано (Окт. 23, 2011 23:36:22)

Офлайн

#2 Окт. 24, 2011 00:38:15

XCoder
От:
Зарегистрирован: 2011-10-23
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Особенности организации множества потоков

Немного пошарился по теме и нашел вот это:

>>> У Python нет средств для определения, какой поток должен запуститься следующим. Нет приоритетов, вытесняющей многозадачности, round-robin и т.п. Эта функция целиком возлагается на операционную систему. Это одна из причин странной работы сигналов: интерпретатор никак не может контроллировать запуск потоков, он просто переключает их как можно чаще, надеясь, что запустится главный поток.



WTF ? o_O



Офлайн

#3 Окт. 24, 2011 21:10:56

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Особенности организации множества потоков

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



Офлайн

#4 Окт. 24, 2011 22:53:34

XCoder
От:
Зарегистрирован: 2011-10-23
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Особенности организации множества потоков

Хм… интересно. Меня немного смутил нюанс с блокировкой из статьи, ссылку на которую я приводил. В ней утверждается, что треды псевдопараллельны, иными словами они в любом случае в рамках одного ядра цпу будут выполняться последовательно, прерываясь в моменты I/O операций, требуемых выполняемому потоку.

Если в целом, то я хотел бы разобраться, это нюанс исключительно реализации интерпретатора питона?

Еще вопрос к опытной аудитории, в таком случае, каким образом наиболее эффективно использовать асинхронные многопоточные алгоритмы?

Моя задача, имея N-процессорных ядер задействовать их все, распределив по ним вычислительную нагрузку.


P.S. Ушел изучать аспекты ядра UNIX…



Отредактировано (Окт. 24, 2011 22:59:25)

Офлайн

#5 Окт. 24, 2011 23:19:11

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

Особенности организации множества потоков

XCoder
Моя задача, имея N-процессорных ядер задействовать их все, распределив по ним вычислительную нагрузку.
Для вычислительной нагрузки нужны процессы.

Я использую потоки в двух случаях:
1. для запросов по сети (когда нужно параллельно скачать несколько страниц)
2. чтобы не тормозило GUI (долгую операцию выполняем в потоке)



Офлайн

#6 Окт. 25, 2011 15:19:43

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Особенности организации множества потоков

Люди! Процессы - те же нитки (потоки, как вы их еще называете), только процессы - это уровень операционной системы, а нитки - это уровень программы (процесса). Конечно, и те и другие находятся под контролем операционной системы. Нитки, если их несколько и если они друг друга не лочат (например, при синхронизации, которую вы сами делаете), выполняются на разных ядрах (или процессорах), если таковые есть в наличии (как правило, есть). Что касается GUI, то тут нитки противопоказаны. Две нитки не могут одновременно рисовать, например, линии. Это особенность как драйверов, как карты, так и самой ОС (в частности, винды).



Офлайн

#7 Окт. 25, 2011 17:21:06

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

Особенности организации множества потоков

Isem
Процессы - те же нитки (потоки, как вы их еще называете), только процессы - это уровень операционной системы, а нитки - это уровень программы (процесса). Конечно, и те и другие находятся под контролем операционной системы. Нитки, если их несколько и если они друг друга не лочат (например, при синхронизации, которую вы сами делаете), выполняются на разных ядрах (или процессорах), если таковые есть в наличии (как правило, есть).
Это всё не про Python. Потоки в нём не “выполняются на разных ядрах (или процессорах)”.

Потоки стандартного модуля threading выполняются одним процессором, но разделяют данные.
Процессы стандартного модуля multiprocessing погут выполняться на разных процессорах и не имеют общих данных. Хотя можно имитировать общие данные с помощью менеджеров (см. multiprocessing.Manager() и т.п.).

Isem
Что касается GUI, то тут нитки противопоказаны. Две нитки не могут одновременно рисовать, например, линии. Это особенность как драйверов, как карты, так и самой ОС (в частности, винды).
Не противопоказаны, но надо понимать где применять. Нажал на кнопку “Обработать данные” - запустился поток обработки данных, и при этом всё приложение не зависает и пользователь может использовать другие элементы GUI.



Офлайн

#8 Окт. 25, 2011 18:04:33

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Особенности организации множества потоков

1 Мне кажется надо договориться - говорим об обычном CPython
2 Питон пускает несколько тредов (в чем можно легко убедиться просканировав треды текущего процесса).
3

Isem
они друг друга не лочат (например, при синхронизации, которую вы сами делаете)
Кроме своих залочиваний есть GIL из-за которого потоки могут много проистаивать.
Kogrom
4 Потоки стандартного модуля threading выполняются одним процессором
насколько я знаю - это не верно см пункт 2.
5 Есть вопрос который интересно прояснить: По моим наблюдениям - GIL освобождается перед вызовом компилированного кода (в том числе и IO). Поэтому если пустить из тредов долгоидграющие прочедуры то они не будут мешать друг другу. Это так?



Отредактировано (Окт. 25, 2011 20:46:21)

Офлайн

#9 Окт. 25, 2011 18:43:31

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

Особенности организации множества потоков

doza_and
1 Мне кажется надо договориться - говорим об обычном CPython
Да. Кстати, у Вас там не везде верное цитирование.

doza_and
Kogrom
4 Потоки стандартного модуля threading выполняются одним процессором
насколько я знаю - это не верно см пункт 2.
5 Есть вопрос который интересно прояснить: По моим наблюдениям - GIL освобождается перед вызовом компилированного кода (в том числе и IO). Поэтому если пустить из тредов долгоидграющие прочедуры то они не будут мешать друг другу. Это так?
Возможно, я немного погорячился, но вот что пишут в документации про GIL (http://docs.python.org/glossary.html#term-global-interpreter-lock):

The lock used by Python threads to assure that only one thread executes in the CPython virtual machine at a time. This simplifies the CPython implementation by assuring that no two processes can access the same memory at the same time. Locking the entire interpreter makes it easier for the interpreter to be multi-threaded, at the expense of much of the parallelism afforded by multi-processor machines. Efforts have been made in the past to create a “free-threaded” interpreter (one which locks shared data at a much finer granularity), but so far none have been successful because performance suffered in the common single-processor case.
То есть один поток в одно время. И разницы от того, что у вас несколько процессоров быть не должно.



Офлайн

#10 Окт. 25, 2011 20:43:34

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Особенности организации множества потоков

Про неверное цитирование верно большое спасибо - ща исправлю. Со мной чтото второй раз уже так - если в одной сессии нескольких людей цитирую.

Помоему простое описание такое - GIL освобождается при любых вызовах внешних процедур (не только IO). Если кусок кода критический, то он откомпилирован => будет нормально паралеллиться threading. Поэтому лично для меня они не накладывают серьезных ограничений.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version