Параллельное программирование на Python

Курс из 15 занятий, читается весной 2021 года в МФТИ, школа ЛФИ, 2 курс.
Тема 3-го занятия: Параллельное программирование на Python.
Материалы курса: github.com/tkhirianov/pydatan
Telegram-канал для общения вольнослушателей: t.me/tkhirianov_data_analysis...
Спонсировать канал: / tkhirianov или www.paypal.me/tkhirianov
Вместо спонсорства мне предлагаю помочь Тимофею 7 лет из Набережных Челнов восстановить ухо: bolshie-dela.com/podarite-voz...

Пікірлер: 123

  • @iritaka
    @iritaka3 жыл бұрын

    Тайм-коды: многопоточность, асинхронность, Thread, Очередь/Queue, GIL 0:00 Однопоточность. Последовательное программирование, где 1 исполнитель 4:26 чередование (interleaving). Планировщик задач 13:02 смысл чередования 14:14 ядро. Работа с отложенными задачами, не зависает 22:10 несколько ядер 23:50 цели параллельного программирования: 24:51 1) интерактивность, 2) скорость вычисления 27:20 CPU Генератор частоты 32:10 2 способа увеличить скорость вычислений: 1) много ядер или процессоров. Система с общей памятью 37:17 2) много вычислительных систем (распределённая). Система с разделённой памятью. Бывают: - гомогенные (кластер/фабрика) - гетерогенные (вычислительная сеть, по network) 41:01 Параллельность 43:14 схемы взаимодействия процессов: 44:08 1) shared memory (общая память) 47:18 (-) критическая секция программного кода (двойное вычисление) heisenbug (гейзенбаг) плавающая ошибка 52:15 как решить: Блокировки. Нужна ОС. Mutual exclusion (взаимные исключения) mutex 57:52 разная организация общей памяти 58:35 Queue Очереди 58:58 Pipe очередь символьная. Низкоуровневые сокеты 1:00:55 параллельный алгоритм затратен и требует сложной отладки (в возможных багах) 1:02:04 отладка параллельных систем. В очередях берет на себя - библиотека ЯП 1:09:02 2) другой, проще способ - взаимодействие процессов: main thread. Нити Исполнения 1:12:42 получение результата из треда - join() присоединение нити 1:15:05 у каждой нити свой стэк. Синхронный и асинхронный вызов 1:16:14 взаимодействие между нитями автоматически происходит через shared memory, мы можем и там организовать очередь для взаимодействия без блокировок. Библиотека очередь queue 1:17:53 GIL (Global Interpreter Lock) в Питоне. Глобальная блокировка интерпретатора. Утечка памяти (memory leak) 1:26:55 (+) интерактивность 1:28:51 Практика. Презентация Многопоточность в Python: 1) Поток и процесс, 2) Передача данных между потоками при помощи pipe и общей памяти, 3) GIL, 4) Асинхронное выполнение потоков, 5) Библиотеки threading, multiprocessing, asyncio 1:29:00 Питон - язык не для параллельного программирования. Но в стандартной библиотеке есть: 1:29:40 1) низкоуровневые нити _thread - Low-level threading API 2) высокоуровневый threading 1:30:54 Код. Создание нитей (потоков) и процессов 1:34:34 получение результата с нити. Запуск потока с применением threading 1:35:30 (+) отдельная возможность - запускать и отдельно - передавать параметры 1:36:34 Глобальные переменные - это великое зло для параллельного программирования. Это скрытая критическая секция 1:42:28 передача данных между потоками при помощи pipe и общей памяти Queue 1:43:11 есть очереди, предназначенные для взаимодействия уже самих вычислительных процессов. А есть - для нитей 1:43:27 библиотека queue для threaded programming (передача информации между нитями) 1:44:16 очередь для разных вычислительных процессов multiprocessing.Queue 1:44:20 когда разные вычислительные процессы у нас работает одновременно несколько интерпретаторов Python. (+) производительность 1:45:00 Код. put и get (давать и брать) в/из очереди 1:47:25 Pipe - структура данных для связи между процессами в multiprocessing 1:53:33 Менеджер - класс многопроцессорных модулей, обеспечивающий общую информацию 1:55:30 Заключение. Ограниченный ресурс параллельности. Возможность параллелизации. Зависимость от данных. Начать вычисление может только 1 актор. При максимальной эффективности Скачать конспект: www.patreon.com/iritaka

  • @user-hu7tu5qe7b

    @user-hu7tu5qe7b

    3 жыл бұрын

    Спасибо Вам

  • @user-nh7ic5ie3q

    @user-nh7ic5ie3q

    8 ай бұрын

    ​@@user-hu7tu5qe7bт

  • @user-nh7ic5ie3q

    @user-nh7ic5ie3q

    8 ай бұрын

    тттТ

  • @user-nh7ic5ie3q

    @user-nh7ic5ie3q

    8 ай бұрын

    Л

  • @mmm43kir
    @mmm43kir3 жыл бұрын

    Пишет "параллельное программирование" не отвлекаясь на свои слова. Это реальный пример такого программирования.

  • @valentin3241
    @valentin3241 Жыл бұрын

    Гениальный преподаватель. С горящими глазами, юмором, уместными метафорами! Нет слов, браво!

  • @fanlug
    @fanlug3 жыл бұрын

    10 выпавших блоков питания из 10

  • @user-ih4mc1je1o
    @user-ih4mc1je1o3 жыл бұрын

    Тимофей Федорович, большое спасибо за ваши лекции, очень интересно и очень полезно

  • @dmitriyvaulin

    @dmitriyvaulin

    2 жыл бұрын

    но не особо точно :)

  • @dimaalexeenko3669
    @dimaalexeenko36693 жыл бұрын

    Крутой канал, мужику респектище, знает своё дело

  • @skrskrbam
    @skrskrbam3 жыл бұрын

    как быстро время летит, попал на ваше видео 2017 года, а вы все также молоды👍🏿

  • @olegger7436
    @olegger74363 жыл бұрын

    Просто замечательная подача информации. Ждем продолжения, тема очень интересная

  • @MrMegaNatural
    @MrMegaNatural3 жыл бұрын

    Спасибо Тимофей, всегда с большим удоволствием смoтрю ваши лекции!

  • @pomapoma6643
    @pomapoma66433 жыл бұрын

    Ваши лекции прекрасны!

  • @user-yq1yd7nx8g
    @user-yq1yd7nx8g3 жыл бұрын

    Шикарное объяснение, спасибо вам

  • @denisbaranoff
    @denisbaranoff3 жыл бұрын

    Как всегда - превосходен 👏 Особенно, хотелось отметить особый талант лектора

  • @act0r399
    @act0r3993 жыл бұрын

    Вот это я понимаю любовь к своему делу, прекасно)) Спасибо Вам Тимофей))

  • @maxbespontoff2771
    @maxbespontoff27713 жыл бұрын

    Великолепная подача информации. Мое вам почтение.

  • @alinakasper392
    @alinakasper3923 жыл бұрын

    Лучший преподаватель в мире.

  • @erxewq2844
    @erxewq28443 жыл бұрын

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

  • @user-pe1um3ml3n
    @user-pe1um3ml3n3 жыл бұрын

    Супер! очень полезно. Скорее бы след. лекция.

  • @sergeyv1534
    @sergeyv15343 жыл бұрын

    Спасибо за лекцию - очень интересно, информативно и полезно!

  • @headcliff07
    @headcliff073 жыл бұрын

    Respect. Timofey Xiryanov You are the best. Thanks!!!

  • @usernoname-wv6of
    @usernoname-wv6of Жыл бұрын

    Это лучшее объяснение фунтамента параллелизма, что я видел. must-see

  • @user-ef3bt9ni4o
    @user-ef3bt9ni4o3 жыл бұрын

    Тимофей Федорович, респект и уважуха, очень вдохновляете, я подсел на ваши лекции)

  • @valitovgaziz
    @valitovgaziz3 жыл бұрын

    Большое человеческое спасибо.

  • @mylittlebigcom
    @mylittlebigcom3 жыл бұрын

    1:27:57 - Новая тема курса от Тимофея Федоровича)) Спасибо за то, что делаете!!!

  • @user-sd3jy8qf3q
    @user-sd3jy8qf3q3 жыл бұрын

    Вспомнил момент восхищения от новости про выход Pentium D - ДВУХЯДЕРНЫЙ!!!! ЭТО КАК ДВА ПРОЦЕССОРА НО В ОДНОМ!!! Статью прочитал тогда в игромании или стране игр, точно не помню журнал.

  • @senegalgreen6869
    @senegalgreen68692 жыл бұрын

    преподаватель от Бога! Спасибо!

  • @Rez0lventa
    @Rez0lventa Жыл бұрын

    Прекрасный рассказчик и отличный материал!

  • @grigoralex406
    @grigoralex4066 ай бұрын

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

  • @Vologdos
    @Vologdos3 жыл бұрын

    Вижу, что Тимофей под конец лекции устал. Красавчик

  • @AntonyKondr
    @AntonyKondr7 ай бұрын

    Гонка в повышении термопакета улыбнула :)

  • @ealbitg1043
    @ealbitg10433 жыл бұрын

    Как всегда лайк. Не хватает примеров, которые вы на ходу демонстрировали на прошлых видео. Например, как с черепахой и объяснением , что происходит в конкретном месте. Этого очень не хватает , когда высоздаете классы наследующие из базовых классов

  • @linkina1585
    @linkina15853 жыл бұрын

    Спасибо Вам большое. Жаль у нас школе так не умеют преподавать материал

  • @hardcoreentertainments5496
    @hardcoreentertainments54963 жыл бұрын

    ++++++++++ Хороший Учитель! Респект однозначно!

  • @mcusfuns6907
    @mcusfuns69073 жыл бұрын

    Рекомендую курс и преподаватель отличный. Коммент вместо второго лайка.

  • @serg3205
    @serg32053 жыл бұрын

    Люблю питончик!!!

  • @theatreoftragedy7524
    @theatreoftragedy75243 жыл бұрын

    Тимофей, подскажите, пожалуйста, в МФТИ есть программы обучения для тестировщиков ?

  • @sekejodemini1
    @sekejodemini13 жыл бұрын

    Круто! А почему следующая лекция скрыта?

  • @tkhirianov

    @tkhirianov

    3 жыл бұрын

    Поправил. Проверяйте.

  • @sekejodemini1

    @sekejodemini1

    3 жыл бұрын

    Тимофей Фёдорович, вы лучший, спасибо!

  • @exploringtheworld8780
    @exploringtheworld87803 жыл бұрын

    Спасибо!

  • @user-hu7tu5qe7b
    @user-hu7tu5qe7b3 жыл бұрын

    Спасибо Вам

  • @yuradubinin9778
    @yuradubinin97783 жыл бұрын

    Барабанщику не сложно, он вёслами не крутит 😂 Нет, а если серьезно , то спасибо вам большое)) Очень интересно слушать

  • @Ma_X64

    @Ma_X64

    3 жыл бұрын

    Хорошему не сложно))) А плохому -- когда как)) Особенно, если после концерта бьют в гримёрке ;D

  • @palyashuk42
    @palyashuk42 Жыл бұрын

    Топовый лектор!

  • @user-zi7tu3xy8y
    @user-zi7tu3xy8y3 жыл бұрын

    буквально недавно задавался этим вопросом многопоточности, пришел к выводу, что не совсем блокировка нужна а реорганизация процесса, Первое это присвоение статусов для объектов с которыми работает поток(процесс) на такие как: свободен, занять процессом, обработан процессом(завершен) и еще возможно какие то дополнительные статусы. Что бы не возникало ситуации доступа нескольких процессов одновременно к одному свободному объекту и путаницы какой процесс раньше его возьмет(как в вашем примере с туалетом), какой позже и т д, организуется очередь. Сначала любой свободный или освободившийся поток попадает в очередь и ждет, пока предыдущий поток не станет занят. схема Fifo lifo. Возможно оно так организовано и я не владею всей полной информации о распределении потоков, но вижу правильной работу распределения такой.

  • @user-vu8pl8zl7h
    @user-vu8pl8zl7h3 жыл бұрын

    Мне понадобилось какое-то время чтобы осознать, что "общая память" не только общая в плане физического расположения относительно акторов, но и всмысле общего доступа к одним переменным (или адресам).

  • @volodymyromelenchuk7528
    @volodymyromelenchuk75283 жыл бұрын

    Огромное спасибо за интересные и полезные лекции! Жаль правда, что ссылка на гитхаб с файлами в описании не активная((

  • @volodymyromelenchuk7528

    @volodymyromelenchuk7528

    3 жыл бұрын

    @@Throttle0496 оо, спасибо! твоя ссылка работает

  • @andriiroiko8608
    @andriiroiko86083 жыл бұрын

    Thanks :)

  • @rhurus
    @rhurus3 жыл бұрын

    1:42:14 функция is_prime не определена

  • @user-gq6dv9pp5h

    @user-gq6dv9pp5h

    3 жыл бұрын

    Видимо какой то блок выше не отработал или так и было задумано.

  • @non5309
    @non53096 ай бұрын

    кто тут еще с курса на степике по многопоточному программированию на python?

  • @LSE13
    @LSE133 жыл бұрын

    Магнитов, кажется, все больше и больше. К концу курса они заполнят всю доску?:)

  • @alexeivinnikov9614
    @alexeivinnikov96143 жыл бұрын

    Добрый день! Не по теме видео вопрос, но всё же: сейчас приняли (или принимают) закон о просветительской деятельности. Как сильно это Вас коснется? Стоит ли уже запасливо копировать Ваши видео себе на винт (а то я недавно начал Вас смотреть и изучать Python) или рано мне панику разводить?

  • @Ma_X64

    @Ma_X64

    3 жыл бұрын

    Здесь точно проблем не будет, т.к. эти лекции изначально для конкретных учебных заведений. Там в законе это отдельно прописано.

  • @KirillKlenov
    @KirillKlenov3 жыл бұрын

    Вводная общая часть прекрасна, практическая часть на питоне несколько сумбурна и непроработана.

  • @alexanderkolesnik9357
    @alexanderkolesnik93573 жыл бұрын

    30:07 Это как так проц к радиатору прилепился?))) это спец экспонат, или он там вообще в сокете без держателя?)

  • @Ginto_O

    @Ginto_O

    3 жыл бұрын

    Ну, вообще сокет можно разобрать, для некоторых китайских процессоров надо так делать

  • @alexeyshulgin4556
    @alexeyshulgin45563 жыл бұрын

    Тимофей Федорович, спасибо за простое разъяснение. Не могли бы Вы кратко коснуться особенностей распараллеливания на CUDA и посоветовать какой-либо популярно-практический материал по этой теме. Спасибо.

  • @tkhirianov

    @tkhirianov

    3 жыл бұрын

    Алексей, к сожалению, не работал пока на видеокартах. Как только поработаю в этой теме и разберусь, постараюсь сделать курс или хотя бы пару лекций.

  • @alexeyshulgin4556

    @alexeyshulgin4556

    3 жыл бұрын

    @@tkhirianov Огромное спасибо! С нетерпением буду ждать.

  • @Ma_X64
    @Ma_X643 жыл бұрын

    С тем, что в микроконтроллере нет операционной системы, категорически не согласен. Каких только ОС нет под них. Ну, самая популярная, конечно FreeRTOS. Но в последнее время появились камни достаточно мощные (даже с несколькими ядрами), чтобы тянуть даже линуксы -- урезанные, конечно, вроде бизибокса. Более того! Параллельная многозадачность в МК существует всегда, вне зависимости от того, используем мы ОС или нет. Там же есть прерывания от периферии, которые могут вклиниваться в основной процесс в случайные моменты. А, например, МК Propeller вообще восьмиядерный, и там вообще всё выполняется истинно параллельно.

  • @vadimushkevich1283
    @vadimushkevich12833 жыл бұрын

    Interleaving. Каждые 50 минут звенит звонок начала урока. Ученик (процессор) открывает портфель, достаёт соответствующую очередному предмету тетрадку, может быть ещё что-то (линейку, циркуль) и приступает к этому уроку. И выполняет этот урок до звонка окончания урока. Затем он убирает эту тетрадь и другое в портфель.По очередному звонку начала очередного урока ученик достаёт тетрадь другого предмета согласно расписанию и т.д

  • @alexeyzabashta
    @alexeyzabashta3 жыл бұрын

    30:05 процессор к радиатору "прикипел"

  • @professorwoland9554
    @professorwoland9554 Жыл бұрын

    Тайм-код 8:20 Правильнее доля вычисляется так: dt/(dt+∆t)

  • @stavros1983
    @stavros198311 ай бұрын

    День добрый. А остальные 10 занятий будут выставляться? Как их можно увидеть?

  • @radifkurbanov3026
    @radifkurbanov30262 жыл бұрын

    1:51:30 - Сразу после запуска процесса p, у вас parent_conn начинает принимать соединения и в этот же момент другой процесс p отправляет туда массив. Так что всё логично. Это же два разных процесса

  • @guiterenzog2723

    @guiterenzog2723

    Жыл бұрын

    Именно поэтому и должен быть вывод другой)

  • @jamjam3337
    @jamjam33376 ай бұрын

    👏👍

  • @Ma_X64
    @Ma_X643 жыл бұрын

    Если кто помнит, не так давно были нередки вредоносы под винду, которые, когда запускались, жрали 100% процессора. Многие думали, что они какие-то мегавычисления там выполняют на проце, а на самом деле, там крутился пустой цикл в потоке, который ожидал подключения по сети. Видимо, оптимизация переключения процессов как-то так устроена, что если никакой серьёзной работы процесс не выполняет, то, типа, подождём -- недолго же, а он всё продолжает и продолжает скакать с команды на команду. Т.е. эти самые вредоносы писались какими-то очень криворукими людьми, которые либо не замечали такого палевного бага, либо не знали, как починить. А там всего-то и нужно, что чем-нибудь занять проц или уйти в сон на миллисекунду, напрмер, проверив отсутствие соединения.

  • @morrigan_ghost
    @morrigan_ghost3 жыл бұрын

    не знаю что я здесь делаю, но очень интересно

  • @ilyaclutcher
    @ilyaclutcher2 жыл бұрын

    В начале видео всё очень было похоже на асинхронность в Python)

  • @dmitriyvaulin
    @dmitriyvaulin2 жыл бұрын

    Прерывание выставляет флаг в стеке процессора, и планировщик - watchdog при проверке пробуждает процессор для выполнения hook-а - входа полученных данных от прерывания в ожидающую программу.

  • @user-oj7lo6mv7h
    @user-oj7lo6mv7h3 жыл бұрын

    39:59 bus?

  • @psevdonim3972
    @psevdonim39723 жыл бұрын

    отличный ролик, но хотелось бы больше материалов по c++

  • @alexp2179

    @alexp2179

    3 жыл бұрын

    кому чего, я вот конкретно этот урок ждал)

  • @idw1n235
    @idw1n2353 жыл бұрын

    Здравствуйте Тимофей. Студенты в МФТИ пишут курсовую, дипломную(по программированию), попадались или рассматривает ли МФТИ работы студентов с коммерческой точки зрения? Дипломная работа, проект который соберут трое студентов, может содержать интересные решения в различных сферах... Тему Искусственный интеллект привлекает Наше правительство в МФТИ?

  • @idw1n235

    @idw1n235

    3 жыл бұрын

    Может ли привлечь?

  • @ninaosokina3551
    @ninaosokina3551 Жыл бұрын

    Процессоры тоже загружены на 146% 😅😂🤣

  • @lonelydance
    @lonelydance3 жыл бұрын

    pymentor

  • @ivanihnatsenkau8984
    @ivanihnatsenkau898421 күн бұрын

    Когда кто-то пытается объяснить как работать с параллельным программированием 1:47:28

  • @avazart614
    @avazart6142 жыл бұрын

    В питоне нет многопоточности - есть только полупоточность. (Шутка намекающая на проблему с GIL)

  • @artemmarzipan5452
    @artemmarzipan54526 ай бұрын

    И давно киркоров преподаёт?

  • @user-zg2bx5cb3d
    @user-zg2bx5cb3d3 жыл бұрын

    ТФ, извините, конечно, но иногда видно непонимание каких-то базовых моментов с вашей стороны. Не стоит смешивать асинхронное выполнение и выполнение на потоках, не рассказав про EventLoop, про разницу I/O-bound и CPU-bound задач. Разумеется, потоки и асинхронность предполагают выигрыш в случае I/O-bound задач, когда процессы решают CPU-bound, но реализованы они по-разному со всеми вытекающими. В случае асинхронного выполнения, в частности, data race condition быть не может, поскольку это не параллельное выполнение, а конкурентное (concurrency), т.е. всё выполняется в одном потоке внутри одного процесса. Тем не менее в asyncio есть Lock, Semaphore, Condition, BoundedSemaphore, Event, Queue и ряд других примитивов синхронизации, но их цель несколько другая. Также рекомендую ознакомиться с понятием воркера, которое есть как на потоках, процессах, так и в асинхронности. Этот способ существенно облегчает и делает более безопасным выполнение корутин (это про асинхронность). Рекомендую: «Архитектура компьютера» Танебаума, «Async Techniques and Examples in Python» Майкла Кеннеди (см. nnmclub, ну или я могу скинуть вам эти материалы), видео с канала Corey Schafer, лекции Юрия Селиванова (Python core developer, asyncio maintainer), Андрея Светлова (aiohttp maintainer), материалы по асинхронности в других языках, где она реализована лучше, нежели в Python: go с его goroutine и каналами, например, или js с его Promise'ами.

  • @user-zg2bx5cb3d

    @user-zg2bx5cb3d

    3 жыл бұрын

    И, возможно, Алексей Голобурдин с канала Диджитализируй в скором времени начнёт свой курс «WEB разработка на Python», где расскажет в том числе про асинхронный Python.

  • @bluxer4225

    @bluxer4225

    3 жыл бұрын

    читать тут все умеют.

  • @georgiipetrovich5407

    @georgiipetrovich5407

    3 жыл бұрын

    Race condition безусловно может возникнуть и при одном процессоре, и нескольких потоках, то есть при concurrent выполнении: ; 1 поток mov addr, %rax ; Произошло переключение потоков ; 2 поток mov addr, %rax inc %rax mov %rax, addr ; Снова переключение потоков ;1 поток inc %rax mov %rax, addr Такая ситуация вполне может случиться при выполнении "конкурентно" чего то в духе x += 1 А когда поток один - это вообще не concurrency

  • @user-zg2bx5cb3d

    @user-zg2bx5cb3d

    3 жыл бұрын

    @@georgiipetrovich5407 нет, ознакомьтесь с темой

  • @user-zg2bx5cb3d

    @user-zg2bx5cb3d

    3 жыл бұрын

    @@bluxer4225 вы этим сообщением доказали, что умеете писать? Или зачем эта никому не нужная, пустая писня от профана?

  • @user-gc5xj6rk9l
    @user-gc5xj6rk9l3 жыл бұрын

    Что такое параллельное программирование? АЛУ не может работать параллельно в силу своей физики. Тогда параллельное программирование это исполнение одной программы несколькими процессорами одновременно. Выигрыш в скорости. На такое параллельное программирование я согласен. То что он описывает это не параллельное а периодическое исполнение разных программ. Время исполнения команд тоже самое. Но теряется время на переходы. В чём смысл?

  • @user-fe5oj9ex9i

    @user-fe5oj9ex9i

    Жыл бұрын

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

  • @alexanderzhilcov5392
    @alexanderzhilcov53923 жыл бұрын

    виндовозеры хехе

  • @BogdanDotPy
    @BogdanDotPy Жыл бұрын

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

  • @user-nh7ic5ie3q
    @user-nh7ic5ie3q8 ай бұрын

    Щщ

  • @TheUncleCarlo
    @TheUncleCarlo3 ай бұрын

    Слабая лекция, важные практические моменты не рассмотрены вообще

  • @mr.senmax6185
    @mr.senmax6185 Жыл бұрын

    Знаю я одного "раба на галерах" - войну устроил.

  • @user-ec8cd5xt1v
    @user-ec8cd5xt1v3 жыл бұрын

    гля. киркоров уже питон преподает)))

  • @patrickspilmann5008
    @patrickspilmann50083 жыл бұрын

    Вы - крутой! Гульфик Фюрер - сидеть! Не надо переплетать себя с политикой, Вы же мастер своего дела, а не политик...

  • @whitebear1903

    @whitebear1903

    3 жыл бұрын

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

  • @MalvinasArgentinas1982
    @MalvinasArgentinas198210 ай бұрын

    No entiendo un carajo