Cool and Fun Python
539 subscribers
30 photos
8 videos
1 file
33 links
Крутой и весёлый Python. Случаи из практики и не только.
Download Telegram
Какая разница между потоком и процессом?

На современных ПК запуск вашей любимой программы приводит к созданию процесса с одним потоком внутри. Можно представить, что процесс - дорога, а поток - количество полос на этой дороге. Обычно по однополосной дороге движется один авто - выполняется ваш код. Получается, что для более быстрого выполнения программы можно создать несколько полос-потоков с авто на каждой? 🤔 Пусть едут парраллельно. Или создать несколько дорог-процессов? Процессы ведь могут решать параллельные задачи.

Но есть одна особенность. 🤓 Представим одноядерный процессор. Он выполняет код нескольких программ одновременно, потому что очень быстро переключается между ними. Сдивнул на пару метров вперёд машину на одной дороге процессе, потом на другой, на третей и т.д. А если внутри процесса несколько потоков, то и тут каждая машина движется по очереди. Одна в движении, остальные стоят.

Если же у процессора несколько ядер, процессы на разных ядрах действительно могут выполняться одновременно. А вот потоки внутри процесса как двигались по очереди, так и остались псевдоодновременными. 😉
#многопоточность
👍9
Прежде чем рассказать о потоках в Python, несколько абзацев о потоках в ОС. Располагайтесь удобнее. История одного предприятия. 🤓

Итак, у нас есть швейный цех - процесс. 🏭
Внутри него есть несколько сотрудников - потоки. 👨‍🔧
А всё содержимое цеха доступно каждому сотруднику, здание же одно на всех. 🤝

Основную часть времени сотрудники залипают в телефоны и ничего не делаю. Разве что мистер Контроль время от времени поглядывает на входную дверь в ожидании клиентов. Два брата близнеца по кличке Модели косятся на стойку заказов, а старичок Видок любуется пустой полкой готовых заказов.

Открывает дверь, заходит клиент. Контроль срывается с места и начинает снимать примерки, уточнять фасон, ткань и прочие детали. Пока он суетится остальные залипают в телефоны и боятся пошевелиться. Разве что Контроль в какой-то момент задумался о допустимых узорах, да так, что застыл на месте. В этот момент один из близнецов Моделей метнулся к столу заказов, увидел что пусто и снова залип в мобилку.

Заказ принят, заявка заполнена, один из близнецов не обращая внимания на застывшего мистера Контроля бежит в соседнее здание-процесс на дальний склад материалов. Там бабушка DеBи по кличке Мускул забирает список и Модельный близнец снова залипает в телефон.

Мистер Контроль снимает очередные примерки с нового клиента. В момент, когда клиент уточняет свои пожелания Контроль даже не шевелится. Зато в эти мгновения слышно как в рабочей зоне близнец Модель шьёт первый костюм.

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

Такая вот веселая работа в процессном цеху у ребят потоков. А самое любопытное, что работает всегда один. Остальные в это время бездельничают, думая о чём-то своём. 😉
#многопоточность
👏8😱2😁1🎉1
Про многозадачность

Недавно возникла задача параллельно выполнять три задачи. Ага, такая вот тавтология. 😀 Конечно же потоки сразу были отметены.

- Почему не потоки? - спросите вы.

Потому что с GIL потоки всегда последовательны.
Да, быстро переключаются.
Да, если нет сложных расчётов, ведут себя как параллельные задачи.
При детальном рассмотрении работают последовательно в рамках одного процесса на одном ядре одного процессора.
Не забывайте эту элементарную особенность классического Python.

Познавательная минутка 🤓
Для запуска трёх задач в виде процессов использовал модуль subprocess
import subprocess
from sys import executable
from os import getcwd

...
python_executable = executable subprocess.Popen([python_executable, 'project_dir/main.py'], cwd=getcwd())
...


✍️ - беру на вооружение
🤯 - как это работает?

#многопоточность
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯87👍1