LINUX.ORG.RU
ФорумTalks

Питонисты

 , , ,


1

2

Немного жж.

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

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

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

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

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

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

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

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

Зачем пользователю Pandas знать про GIL??

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

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

Профессионалы из Вилларибо пишут строго правильно на asyncio а говнокодеры из Виллабаджо хренпчат говнокод на тредах. А когда надо зацепить очередную нативную библиотеку

Ты забыл часть «а когда надо на aio перетащить полсотни не-aio микросервисов»

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

Ну сам подумай, ему нужно гигантские матрицы перемножить, или нейросеть обучить. Это всё готовые либы, очень высокоуровневые.
У меня, если данные в pandas не влезают, они влезают в dask. Который многопроцессный, кластерный, и всё равно не нужно знать про GIL...
А судя по ЛОР, многие, слышавшие про GIL, думают, что из-за него возможно только синхронное выполнение кода.

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

Глянул в гугл сюда вроде, решение элементарно, но если оно не использовалось то по памяти не вспомнить. Не уверен что это всё полезно в памяти держать постоянной.

Да, и внезапно это не онсайт-тест, гуглом пользоваться можно (что отдельно оговорено в тесте), от чего и припекает. В плане решение по факту прям в доке написано, но ведь док никто не читает

И умение пользоваться поиском это кстати тоже крайне необходимая вещь. Если человек за 2.5 часа теста не может даже с помощью гугла найти решение элементарной задачи - кажется лучше ему искать работу дальше

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

Да так-то я только за унификацию и кругозор... Но вот cobold-у чем знание о GIL помогло?

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

Ты зря его тыкаешь, он в целом прав. Помню когда в ML работал у нас были отдельно аналитики и программисты. Работа аналитика - сделать на пандасе чтоб работало, пусть за сутки и с постоянными падениями. Работа программиста - взять это решение и сделать из него адекватный, быстро работающий сервис.

То есть это конечно нифига не идеально, но разделение труда не на пустом месте придумали

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

разделение труда не на пустом месте придумали

Да, но <шутка про нюанс>.

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

Пандас ... и как словарь его юзать мягко говоря не стоит.

Достаточно думать о пандасе как о гигантском Excel без GUI, и всё станет хорошо. А тебе, наверно, был нужен numpy

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

Смотря что он преподает. Подозреваю, что не асинхронное программирование.

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

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

Я чувствовал себя невероятно крутым, но почему-то регулярно получал звезды от лида за то, что мой крутой код в 4 и даже в 2 строчки никто не понимает

5 строк в данном случае нормальное решение - взять лок, вызвать print, встать на ожидание. Плюс собственно объявление лока и условия. Это не бешеная хрень типа моего «любимца» на перле

$result{s/^out_(.+)/$1/gr} = delete $result{$_} for qw/out_key out_value/;
upcFrost ★★★★★
() автор топика
Ответ на: комментарий от WitcherGeralt

Это не азы, а довольно узкая область.

Я использую Python в качестве основного и единственного языка в своей текущей работе. Асинхронный код мне писать не нужно и я в этом не разбираюсь. Понадобится написать - разберусь. Про GIL я лишь «имею представление». Работать мне это не мешает.

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

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

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

Понадобится написать - разберусь

Вот, фраза адекватного человека. Если решение задачи по факту прям в доке на concurrent лежит, и гугель можно и нужно - кажется задача весьма простая

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

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

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

Работа да, в офисе, можно внж Швейцарии тип С либо В без привязки. Либо паспорт ЕС и будем делать тип G. Иначе адский геморрой

Про аналитика если что - с предыдущей работы. Тут чистый веб бэкенд

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

Всё сильно хуже.

Самый лол, когда ты ПОНИМАЕШЬ, что рулишь потоками не очень хорошо, но ничего с этим не можешь, т.к. мало того, что нет инструмента для поиска race condition, так ещё дебаггер порой руинится при попытке отладить код (пламенный привет Twisted).

Да-да, Python для разработки на изи, ага…

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

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

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

ProcessPoolExecutor — можешь и все ядра

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

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

Все просто, те кто доходит до необходимости решения задач через параллелизацию, изучает ее уже на другом ЯП.

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

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

Внимательней.

асинхронного запроса по сети треды

Какая-то ахинея. Тренды как раз для асинхронного запроса и не нужны, они нужны для синхронного.

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

чот вычислять нужно.

Возьму кластер dask.

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

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

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

Какая-то ахинея. Тренды как раз для асинхронного запроса и не нужны, они нужны для синхронного.

Для синхронного не блокируя основной поток. С точки зрения основного потока запрос асинхронный

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

А ещё, в отличии от asyncio треды небыли написаны одним полудурком, который без мата даже разговаривать не умеет

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

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

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

WitcherGeralt ★★
()

Задача на самую базовую синхронизацию тредов

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

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

Асинкио норм

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

Если сейчас он норм и там контрибуторов больше чем один человек, то классно.

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

Не уверен, что синхронизация тредов - это «базовая» задача или паттерн уже лет пять как. 

Не базовая задача программирования, а базовая задача на синхронизацию. Плюс гугель можно, в чем сложность?

Синхронизация иногда бывает нужна, но на том уровне который спрашивается - это по факту проверка открывал ли человек хоть раз док на concurrent и знает ли он что такое лок вообще. Ну и умеет ли вообще поиск юзать

Кто вообще хоть в каком-то языке синхронизирует треды в прикладном пограммировании

В яве бывает. Атомик это хорошо, но не всегда, иногда приходится руками.

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

Если сейчас он норм и там контрибуторов больше чем один человек, то классно.

Да, есть довольно много народу кто его юзает. Даже сам например начал пилить протокол к монге под него. Уже и для бото есть обертки, и для редиса, и неплохой aiohttp. Даже в grpc его завезли месяц назад

Основная боль что для его грамотного использования нельзя просто отмазаться run_in_executor, надо натурально переписать дохрена кода (собственно pymongo тому живой пример, motor по факту фейк а не asyncio)

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

В яве прекрасно можно использовать паттерн с конкаррент очередью, как и в с# собственно. Я не могу представь себе задачу при которую нельзя решить не обмазавшись лачами и прочей дидовской дичью.
Если у тебя есть такой пример - будет интересно.

system-root ★★★★★
()
Ответ на: комментарий от DarkAmateur

Твистед кстати вообще инопланетная хрень, уже три дня пытаюсь раздуплить как правильно deferred юзать. Какая-то подлодка с вертикальным взлетом

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

Да хоть банальный микрокеш на мапах, классика для ReadWriteLock.

ConcurrentMap можно, но не всегда, например нельзя если мап больше одной

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

Ну сделать две BlockingQueue, три, сколь вообще тред может разных типов данных генерировать? Больше двух уже, как по мне, странно было бы.

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

Ну сделать две BlockingQueue

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

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

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

Разве не этого мы хотим от кода?

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

Ну всё-таки set/get для кеша на очередях делать это не самое читаемое решение кмк. С rwlock все понятно и прозрачно, где read и где write

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

Если нужно читаемо кеш нагородить, и говрить уже не про пайтон, то это делается холдер конкаррент мапы, потом у него есть отдельный сервис для предоставления api и все пользователи даже не знают откуда данные беруться, может вообще из интернета.
А холдер конкаррент мапы настолько стандартный код, подобное обсосанно милион раз, т.к. часто нужно было для гибернейта сессию хранить трейдсейв.
И выходит пару классов. Оба из которых шаблонные до нельзя, что вопрос про читаемость даже не стоит обсуждать.

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

Вообще от темы отошли. Сам тред про треды и тупеньких пограммистов.
Ну ок, зачем-то мне в 2021 захотелось треды. Ок. Мало ли, есть зависимости или ещё чего, что не умеет иначе.

  1. Я могу это сделать без написания кода связанного с менеджментом блокировок? Да.
  2. Я могу, как пограммист, делать так всю свою карьеру «3 месяца стажировки после курсов пипбрейнс»? Да.
  3. Лучше будет, если я сделаю код без этой мудянки? По мне, так да.
  4. Выходит, что лучше взять на работу пограммиста, который не будет делать мудянку, а ещё лучше, чтобы он даже не знал как её делать, на всякий так сказать случай.

В чём мои рассуждения не сходятся с реальностью?

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

В чём мои рассуждения не сходятся с реальностью

ещё лучше, чтобы он даже не знал как её делать

В этом. И если ты думаешь что люди, не знающие даже что такое лок, могут например эффективно юзать тот же asyncio - это не так в 99% случаев. Скорее всего они запорят loop на первом же тяжёлом вызове и всё, приехали. По тесту это кстати видно

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

Скорее всего они запорят loop на первом же тяжёлом вызове и всё, приехали.

Не уверен что в этом контексте значит «loop».

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