LINUX.ORG.RU
ФорумTalks

Питонисты

 , , ,


1

2

Немного жж.

Ищем питониста, включил в тест одну из своих любимых задач. Задача на самую базовую синхронизацию тредов (либо тасков если хочется asyncio), и в N=2 варианте решается в 5 строк. Даже в 2 строки, в зависимости от интерпретатора и условия. Тупо пара локов.

Из нескольких сотен кандидатов её кое-как в базовом варианте решил один. Вариант в N>2 потоков не решил вообще никто. Большинство людей походу даже не дошли что там блин надо что-то синхронизировать.

Wtf? Неужели никто из питоноедов ни разу потоки не юзал? Типа фласк/джанга/GIL все стерпят, а что там внутри пофиг?

P.s. вакансия висит в жобс, но нужен паспорт EU/EFTA

★★★★★
Ответ на: комментарий от peregrine

Вот честно не понимаю зачем при GIL нужен threading.

Например для отправки данных в другие процессы, Queue. Отправку данных проводит автоматически запускаемый фоновый поток. Так как этот поток не выполняет Python код то он освобождает GIL для интерпретатора и занимается конкретно своей задачей - отправлять данные в другой процесс.

GIL это mutex lock всего интерпретатора. Т.е. гранулярность потоков в Python - весь интепретатор. Потоки выполняющие C код запрашивают GIL когда нужно выполнить какой-то Python код.

Потоки в Python средство для конкурентного кода, не параллельного. Потом реализовали в дополнение async.

В РФ и Китае есть такой коллективный психологический комплекс, там многие думают что лаоваи тупые или чего-то не знают сокровенного но при этом лежащего на поверхности, как кажется. А вот они это видят и им подсознательно снова хочется послушать Задорнова который этот комплекс монетизировал, эксплуатировал.

tp_for_my_bunghole
()
Последнее исправление: tp_for_my_bunghole (всего исправлений: 1)
Ответ на: комментарий от TheAnonymous

Умеет, но именно питоновый код может выполняться только в одном потоке одновременно. Проблем синхронизации это не решает и любой вызов нативнтго кода или i/o сразу же даст работать другим потокам

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

Ты путаешь треды и процессы

Нет, не путаю. Я про то, что в основном параллелизация (в python) на процессах делается и там если и нужны, то другие блокировки.

Кстати, пул потоков для параллельного IO - про этот кейс забыл.

qaqa ★★
()
Последнее исправление: qaqa (всего исправлений: 1)
Ответ на: комментарий от upcFrost

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

«Б» получает входные данные для генерации графики. «А» перед отправкой отчёта должен заблокироваться на получение результа «B». Для Thread это join() метод. Одна строка.

Для чего может понадобиться Lock…

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

Для чего может понадобиться Lock

Это было про «зачем вообще треды в питоне», не про лок.

Для Thread это join() метод. 

Вот это кстати некрасиво. Лучше юзать future и пул, а не плодить треды руками

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

Кстати, пул потоков для параллельного IO - про этот кейс забыл.

Что является крайне частым кейсом, о котором и идёт речь

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

Питон если честно самый нетривиальный язык в плане чего-то больше чем hello world который я видел. Очень много тонких подводных айсбергов, особенно если нужна производительность

Да есть же. Как долго я вас учил.

byko3y ★★★★
()

Wtf? Неужели никто из питоноедов ни разу потоки не юзал?

Нет конечно. multiprocessing или c++ код для cpu-bound, asyncio для io-bound. Синхронизация в первом случае - не в питоне, во втором - нужна крайне редко.

Типа фласк/джанга/GIL все стерпят, а что там внутри пофиг?

Вариант что люди досконально знают как работает GIL и осмысленно на него полагаются конечно же не рассматривается?

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

Ты путаешь многопоточность и многозадачность, бывает, да.

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

Да вот и я о том. Ладно б это было whiteboard interview. Так нет, сидишь дома, онлайн тест, гугель можно, дока есть, даже можно код в пайчарме гонять перед тем как отправлять.

Я просто хз насколько надо упороться чтоб в такой ситуации не решить абсолютно примитивную задачу

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

upcFrost ★★★★★
() автор топика
Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от peregrine

В код секции две задачи, одна чисто жсон переложить, вторая сабж. На них кажется 90 минут даётся. Ну и плюс если успел другие секции до дедлайна, код - последняя.

Кмк за час можно питонодок прочесть вообще вслух и по ролям. Единственный чувак кто эту задачу хоть как-то решил убил на неё 90 минут и за 10 минут решил жсоны. Он правда её не канонично решил, что его и свалило на N>2, но хоть так

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

Простые, там разве что пачка условий типа если в жсоне нет А то Б иначе В. 10-15 минут адекватное время кмк

В плане, я серьёзно не пытаюсь ткнуть людей носом в какаху, там нет никаких целенаправленно завальных/сложных вопросов

Ладно, гоню, один есть, но он не на код а на его чтение, и он не критичный

upcFrost ★★★★★
() автор топика
Последнее исправление: upcFrost (всего исправлений: 3)
Ответ на: комментарий от upcFrost

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

Или у вас только сплошь вчерашние выпускники без опыта собеседуются?

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

Прочитал вакансию в Job. Подожди, ты хочешь сказать, что вы не можете туда никого найти всё это время?!

Кстати да, @upcFrost Может, просто, вам не на российских программистов ориентироваться впредь? Или уже? У нас в конторе был набор - так множество адекватных людей из бразилий и восточных европ взяли.

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

Подожди, ты хочешь сказать, что вы не можете туда никого найти всё это время?!

Внезапно. И более того, на лоре я её выложил уже после того как попробовали и линкедин, и глассдор.

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

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

Ну я поэтому и уточнил. Окей, понимаю. Как хак, предлагаю - размещайте вакансию Сишника, с обязанностями кодинга на питоне :) Похожим образом уходят в автоматизацию тестирования, например. Не будешь же размещать вакансию Тестер + Python. Придут вебмакаки. Берешь cишника-сеньора на проект, адекватный видит, что капец творится с тестированием - и становится тимлидом QA в результате.

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

Вариант что люди досконально знают как работает GIL и осмысленно на него полагаются конечно же не рассматривается?

Нет. Потому что GIL это не фича, а проблема - причем в конкретной реализации (например в jython/ironpython его нет)

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

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

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 3)
Ответ на: комментарий от peregrine

Да и в пандемию в офис гонять многие не хотят вообще.

Кстати, похвастаюсь :) Наш отдел разъехался на удалёнки в 2018, убедив начальство. В 2020 мы пожинали плоды отличной устаканенной инфраструктуры распределенной работы. С железками имеем дело, да. Для многих будет сюрпризом, но обычно в мире доставка с завода плат и чипов происходит за 3-5 дней даже в е№№ня, если это не РФ, обычно: в пятницу отправили, в понедельник тебе DHL под дверь кинул. На практике это оказалось абсолютно рабочей формулой.

zendrz ★★
()
Последнее исправление: zendrz (всего исправлений: 1)
Ответ на: комментарий от peregrine

что-то мне подсказывает что в Швейцарии их не много

В Швейцарии их нет от слова совсем. Обычно приезжает Франция или восточная Европа. Деньги кстати средняя по рынку, тот же сонар платит столько же

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

Наш отдел разъехался на удалёнки в 2018, убедив начальство

Это крайне личная тема. У нас есть люди кто и на удаленке и в офисе одинаково, другим на удаленке лучше, третьим хуже. Сейчас где-то 30% удалённо сидят

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

размещайте вакансию Сишника

Сишники в ЕС вымерли давно. Где надо - завозят с бывшего союза

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

Вот это кстати некрасиво. Лучше юзать future и пул, а не плодить треды руками

Упоминались треды в контексте описанного собеседования.
Lock нужны для data contention где параллельность, и сложность в их организации.
Знать про data contention и mutex обязательно по умолчанию.

Другой вопрос что иногда team-lead не знает что Lock-и требуют аудита кода для предотвращения «deadly embrace»(deadlock). Когда в параллельной операции нужно запросить более одного Lock, нужно следить чтобы везде эти Lock запрашивались в одной последовательности относительно друг друга.

tp_for_my_bunghole
()
Последнее исправление: tp_for_my_bunghole (всего исправлений: 1)
Ответ на: комментарий от upcFrost

И зачем тут треды, локи, дедлоки, текущая память? Что мешает запустить рисовалку в подпроцессе и общаться с ней через пайпы(или любой ipc по вкусу)? Ну или вообще по ести.

С подпроцессом можно общаться в неблокирующем режите тоже.

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

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

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

перечитай пост на который отвечаешь.

Ну или вообще по ести.

Это внезапно и есть запрос по сети к другому сервису, и поскольку он может занять прилично с точки зрения пользователя времени, то вполне можно пустить его параллельно

И зачем тут треды, локи, дедлоки, текущая память

Ты где здесь нашёл дедлок и текущую память? В submit + future.get?

запустить рисовалку в подпроцессе

В плане ProcessPool или subprocess? Если первое - проще разные сервисы. Если второе - это крайняя мера и вообще за subprocess надо бить по рукам

upcFrost ★★★★★
() автор топика

Так в питоне потоки неудобные. Они по сути бесполезные, вместо них используют процессы, а там прокся сама разруливает. Это очень специфическая задача для питона, если им нельзя было гуглить - ничего удивительного. Да и в других яп ручное управление потоками тоже далеко не везде встречается, особенно в вебе - там всем фреймворки рулят. Или тебе сильно хардкорный синьор нужен?

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

если им нельзя было гуглить - ничего удивительного

Можно было. См. выше. У них был час и возможность делать что угодно.

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

Они по сути бесполезные

Для замены aio - вполне, читай выше

если им нельзя было гуглить

Можно, читай выше

Вообще решение прям в доке есть, открыть ман, внимательно прочесть первые 5 абзацев про Condition и сделать как там написано. Даже думать не нужно

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

Тогда конечно звоночек, не нагуглить типовые решения за час - это уметь надо. Да даже без гугла, просто открыв документацию, где есть queue и multiprocessing.Queue.

InterVi ★★★★★
()

Задача на самую базовую синхронизацию тредов (либо тасков если хочется asyncio),

Что такое «синхронизация» тредов в твоем понимании ? ( вопрос совершенно некорректен ) В asyncio, threads память общая , для multiprocessing существует shared memory.

Если хочешь ее изменять сразу и везде - можешь изменять - питон не упадет, память не покорраптится. Боишся за данные - используй только атомарные операции. Хочешь сразу менять обьекты в памяти - ССЗБ используй Локи ( Хотя это говорит о твоем уровне ).

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

Я не дошел - обьясни в примерах - что это ?

Из нескольких сотен кандидатов её кое-как в базовом варианте решил один. Вариант в N>2 потоков не решил вообще никто.

Чем отличается вариант N>2 от варианта N==2 ? Поставить вместо 1 Лока N ?

Jopich1
()
Последнее исправление: Jopich1 (всего исправлений: 1)
Ответ на: комментарий от Jopich1

Ещё один. В доках даже пример есть:

import threading, queue

q = queue.Queue()

def worker():
    while True:
        item = q.get()
        print(f'Working on {item}')
        print(f'Finished {item}')
        q.task_done()

# turn-on the worker thread
threading.Thread(target=worker, daemon=True).start()

# send thirty task requests to the worker
for item in range(30):
    q.put(item)
print('All task requests sent\n', end='')

# block until all tasks are done
q.join()
print('All work completed')
InterVi ★★★★★
()
Ответ на: комментарий от Jopich1

Если хочешь ее изменять сразу и везде - можешь изменять - питон не упадет

deadlock, livelock, race condition

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

Чем отличается вариант N>2 от варианта N==2 ? Поставить вместо 1 Лока N ?

Очерёдность. На 2 потоках это легко (не один так другой), на N>2 нужно контролировать кто за кем идёт

Боишся за данные - используй только атомарные операции

Где, в питоне? Ну скажи мне, мил человек, a += 1 атомарная или нет

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

Тогда конечно звоночек, не нагуглить типовые решения за час - это уметь надо.

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

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

Последствия хайпа. На прекрасное.ит выкладывали чёрные списки украинских hr, вот там реально ад.

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

при ‘a += 1’ ты данные не потеряешь ( если тебе не важна разница в каком порядке твои треды этот счетчик уменьшать или увеличивать будут ), а вот при изменении структуры ‘a = {«test» : += 1 }’ вполне можно.

Jopich1
()
Последнее исправление: Jopich1 (всего исправлений: 2)
Ответ на: комментарий от Morin

Да ладно очевидный. Зависит от того как оператор определён, и производительность соответственно.

Принт очевиднее имхо

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

при ‘a += 1’ ты данные не потеряешь

Да ну. Ты знаешь как он внутри работает? Если += не определён, то питон идёт делать обычное присваивание, и вот между проверкой и присваиванием вполне можно сделать весело

Заметь, я нигде не сказал что а - число

upcFrost ★★★★★
() автор топика
Последнее исправление: upcFrost (всего исправлений: 1)
Ответ на: комментарий от upcFrost
import dis

dis.dis("print("foo")")
import dis

dis.dis("a += 1")

да ладно?

пояснять как приходит gil в мнении авторов питона надо? так уж получилось что это только мнение

поправил, чтоб красивенько

Morin ★★★★★
()
Последнее исправление: Morin (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.