LINUX.ORG.RU

правильно ли я понимаю мультизадачность?

 


2

1

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

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

укажите пожалуйста на дичь:

[code]

  1. реальная мультипроцессорномть использует для каждого процесса отдельное ядро
  2. в python не существует реальной многопроцессорности, а используется модуль multiprocessing. который выполняет операции в различных процессах, но имеет каналы коммуникации между этими процессами.
  3. при этом количество ядер, задействованных в вычислениях контролируется ОС и python на это повлиять не может
  4. мультипоточность это когда вычисления производятся внутри процесса несколькими потоками
  5. эти потоки имеют доступ к общим ресурсам и удобную коммуникацию между собой
  6. существует набор моделей управления потоками: lock, semafor, events, etc. при их помощи потоки могут блокировать/освобождать соседние потоки.
  7. эти модели реализуют модель кооперативной многозадачности
  8. существует ещё вытесняющая многозадачность. это когда ОС(или GIL) сама решает когда переключаться между потоками
  9. в однопоточном приложении можно более эффективно работать с IObounded-операциями (например ожидание ответа http), если использовать асинхронность
  10. таким образом для повышения эффективности программы удобно использовать(в порядке убывания): мультипроцессорность(в виде модуля multipricessing), мультипоточность, асинхронность [/code]


Последнее исправление: prozaik (всего исправлений: 3)

GIL не распространяется на вызовы нативного кода, так что и многопоточность может оказаться «настоящей».

anonymous
()

существует ещё вытесняющая много задачность. это когда ОС(или GIL) сама решает когда переключаться между потоками

Вытесняющая многозадачность можеть реализовываться в рамках виртуальной машины ЯП (см. Erlang).

theNamelessOne ★★★★★
()

На самом деле теперь не всё так плохо благодаря ProcessPoolExecutor и asyncio. Асинхронность и мультипроцессинг можно совместить. Это довольно удобно и действительно решает проблему во многих задачах.

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)

реальная мультипроцессорномть использует для каждого процесса отдельное ядро

Нет такого понятия, «реальная мультипроцессорность».

Есть мультипроцессорность – это когда в системе несколько процессоров.

Есть мультипроцессность – это когда на одной системе выполняется несколько процессов.

Слово «реальная» в обоих случаях не используется.

Есть системы реального времени – это когда система работает в рамках временных ограничений.

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

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

«Реальной мультипроцессорности» не существует вообще, см. пункт выше.

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

при этом количество ядер, задействованных в вычислениях контролируется ОС и python на это повлиять не может

ОС решает, какие процессы на каких ядрах исполняются. Обычно ОС позволяют влиять на это, устанавливая приоритеты для процессов. Это можно делать из питона.

То же самое верно для потоков. ОС решает, когда какой поток исполняется на каком ядре.

мультипоточность это когда вычисления производятся внутри процесса несколькими потоками

Типа того.

эти потоки имеют доступ к общим ресурсам

Потоки имеют доступ к ресурсам процесса. Например они все исползуют одно и тоже адресное пространство для памяти. Например, один поток имеет доступ к переменным всех других потоков. Того же самого можно достичь в нескольких процессах, гугли «shared memory».

и удобную коммуникацию между собой

Нет. В сравнении с процессами потоки имеют только общую память по умолчанию. Наверное это удобнее тем, что не надо её настраивать дополнительно, но ничего «удобного» в ней нет. Если один поток начнёт писать в переменную, которую в это же время читает другой поток, то будет жопа. То же самое верно и для нескольких процессов с общей памятью.

существует набор моделей управления потоками: lock, semafor, events, etc. при их помощи потоки могут блокировать/освобождать соседние потоки.

Ничего не знаю про модели. Это механизмы предоставляемые ОС, при помощи которых потоки могут блокировать в первую очередь себя (косвенно другие потоки) и освобождать другие потоки (не себя).

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

Их можно использовать и для управления несколькими процессами.

Их неосторожное использование чревато взаимными блокировками потоков и прочими весёлыми вещами. Модуль multiprocessing это всё перенимает на себя в своих очередях.

эти модели реализуют модель кооперативной многозадачности

Как бы да, когда один поток блокирует себя, а ОС передаёт управление другому потоку, то это в принципе кооперативная многозадачность, ага. Но ОС может остановить поток и на своё собственное усмотрение, поэтому многозадачность у нас всё равно вытесняющая.

существует ещё вытесняющая многозадачность. это когда ОС(или GIL) сама решает когда переключаться между потоками

Ага, только решает исключительно ОС, GIL ничего не решает.

в однопоточном приложении можно более эффективно работать с IObounded-операциями (например ожидание ответа http), если использовать асинхронность

Более эффективно в сравнении с чем? С однопоточным приложением не использующем асинхронность – да. С многопоточным – всё сложно.

таким образом для повышения эффективности программы удобно использовать(в порядке убывания): мультипроцессорность(в виде модуля multipricessing), мультипоточность, асинхронность [/code]

Нет, всё сложно.

ЗЫ: Потоки – понятие относительное. Питон использует потоки реализуемые операционной системой.

anonymous
()
Ответ на: комментарий от theNamelessOne

https://ru.wikipedia.org/wiki/Global_Interpreter_Lock
https://ru.wikipedia.org/wiki/Вытесняющая_многозадачность

Проитаешь, что такое первое, и определение второго, тебе станет понятно, что принудительное переключение планировщиком и одим мьютекс на все потоки — это самая что ни на есть вытесняющая многозадачность в врямом соответствии с определением, за исключением того, что это не на уровне ОС.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Проитаешь, что такое первое, и определение второго, тебе станет понятно, что принудительное переключение планировщиком и одим мьютекс на все потоки — это самая что ни на есть вытесняющая многозадачность в врямом соответствии с определением, за исключением того, что это не на уровне ОС.

Дай пожалуйста ссылку, где в коде cpython планировщик потоков, который их принудительно переключает и не на уровне ОС.

anonymous
()
Ответ на: комментарий от anonymous

Там нет планировщика как сущности, есть цикл, который гоняя фреймы считает тики и время и отпускает GIL. ОС в этом никак не участвует.

WitcherGeralt ★★
()
Ответ на: комментарий от quester

почему бы не использовать golang? )))

Потому что гладиолусугл?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.