- Посещаемость
- Процесс
- Поток
- Что можно узнать про процесс?
- создание процессов
- создание потоков
- CPU-bound / IO-bound задачи
- GIL
- GIL
- GIL
- GIL
- Практика
- Дополнительная литература
- Что такое Celery?
- Практика запуска задач на Celery
- Практика запуска задач на Celery
- Celery и Django
- Почитать
- Что такое map-reduce
- Практика запуска map-reduce на pyspark
- Практика запуска map-reduce на pyspark
- Вопросы-ответы
Это программа, находящаяся в режиме выполнения. Операционная система подгружает в оперативную память с каждым процессом
- Саму программу
- Данные к программе
- Стек программы
Переключение между процессами происходит на уровне ядра.
Потоков не существует! Есть только процессы, но чуть-чуть другие \Smiley[][yellow]
- Каждый процесс состоит из минимум одного потока.
- Потоки разделяют общее адресное пространство процесса.
# посмотреть все процессы
ps alx
# посмотреть все процессы пользователя
ps a -u
ps a -u redis
# добавить информацию о тредах
ps -eLf
# здесь "хранится" процесс
ls -l /proc/<PID>/
Для создания нового процесса используются системные вызовы копирования процесса:
- clone: UNIX-системы
- CreateProcess: Win2k-системы
В Linux это тот же
- CPU-bound: задачи, которые активно используют CPU. Арифметические операции, матричные вычисления, поиск строк, и т.д.
- IO-bound: задачи, связанные с вводом-выводом данных. Работа с сетью, с файловыми системами, с пользовательским вводом
/* This is the GIL */
static PyThread_type_lock
interpreter_lock = 0;
GIL гарантирует интерпретатору, что только один поток может быть запущен в текущий момент. Это сделано для безопасной работы управления памятью, вызова расширений написанных на других языках (на C).
- sys.getcheckinterval() # -> Python2
- sys.getswitchinterval() # -> Python3
GIL замедляет CPU-bound задачи. Старая реализация GIL очень плохо работала с CPU-bound + IO-bound задачами. Пример, да и новая не лучше.
- GIL
- UnderstandingGIL.pdf
- Groking The GIL
- GIL и его влияние на многопоточность в Python
- multiprocessing
Официальная документация
\newline{}
Celery это брокер задач, который позволяет в фоновом, асинхронном режиме выполнять задачи в отдельных процессах/тредах и/или на других машинах.
pip install celery
apt install rabbitmq-server
cd celery_example
docker compose up -d
celery -A tasks worker --loglevel=INFO
./runner.py
Это процесс решения больших задач при помощи разбивки данных на части и решения задач с частями данных на разных машинах. MapReduce состоит из обязательных шагов:
- Map — разбить данные на блоки (присвоить каждой записи некоторый ключ блока)
- Shuffle — присвоить каждому блоку некоторый ключ (не-уникальный между всеми блоками)
- Reduce — для каждого ключа выполнить некоторую функцию над всеми данными в этом ключе
тестовая сборка для работы с Hadoop (надо дополнительно поставить python на namenode)
-
запуск на NameNode
hdfs dfs -rm -r -skipTrash\ /d/out hadoop jar /opt/hadoop-2.7.4/share\ /hadoop/tools/lib/\ hadoop-streaming-2.7.4.jar\ -files /root/mapper.py,\ /root/reducer.py\ -mapper /root/mapper.py\ -reducer /root/reducer.py\ -input /d/in/98.txt\ -output /d/out hdfs dfs -cat /d/out/part-00000