LINUX.ORG.RU

В кои-то века родил статью по своей питоновой либе

 ,


2

1

https://habr.com/en/post/526002/ — Making python's dream of multithreading come true

Хотелось написать что-то для прочтения буграм, но и вам запощу, так и быть. Буду благодарен, если кто-то запостит это на reddit.com/r/python и даст ссыль сюда, потому что мне еще две недели нужно ждать, пока аккаунту разрешат делать посты.

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

В частности, написание статьи само по себе помогло сообразить, что без механизма каналов особо нечего ловить в прикладнухе. Причем, я уже знаю, как эти каналы можно сделать гибкими на зависть Go-шникам, потому что это будет не прибитый гвоздями к языку черный ящик, а отдельные примитивы синхронизации и хранилище аля std::deque, для которого можно как быстро в lock-free режиме добавлять и забирать записи, так и выполнять на самом питоне сложные транзакции плана «выбрать записи определенного типа из очереди» — не блокируя при этом lock-free добавление новых сообщений и не блокируя параллельных читателей. То есть, в одном флаконе умещаются любые сочетания взаимодействий производитель-потребитель. Конечно, я подозреваю, что алгоритмы на питоне будут тормознутыми, но что ж поделать, это питон.

★★★★

Последнее исправление: byko3y (всего исправлений: 2)

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

@metaprog, выходи.

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

Разверни свою мысль, он тут как фигурирует?

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

А все анон, я понял при чем тут @metaprog не вставай.

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

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

Вот именно. Всем хочется библиотеку функций «sdelat_vse_zaibis()». По факту там было непаханное поле, и я распахал уже как минимум половину. Если под «воды много» имел в виду то, что я слишком обще описал многие вещи — я боюсь, что если я перейду на сухую конкретику, то у тебя завянут уши, потому что рассказывать нужно будет в разы больше. Например, высвобождение памяти я описал в одном абзаце, а по факту там у каждого потока очередь высвобождения, при постановке в которую отправляется сигнал отдельныму потоку высвобождения, который все эти очереди собирает, группирует по кучам, и по кучам высвобождает.

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

Не ну это +, конечно. А вообще реализации Python без GIL где-нибудь взлетели?

Проблема в том, что питон без GIL — это реализация стандартной библиотеки с нуля. Вроде каких-то Jython и IronPython, которые вместо библиотеки CPython используют библиотеку жабы и дотнета соответственно. Попытка избавиться от GIL — это путь вникуда, как я написал в статье, потому что Питон — это плохой язык, и ни разу не простой на самом деле (это я не рискнул написать), и пользуются им только ради готовых решений.

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

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

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

Это и представляет технический интерес, если у кого-то что-то вянет, ему это не надо.

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

Имхо лучше просто выкидывай куски кода с небольшой аннотацией что это и что оно решало и что ты хотел этим добиться и почему сделал именно так

Там 11к тысяч строк кода. Сишного. Это то, что реально сделано. Я во только недавно сел разбираться, какие примеры на питоне можно написать, чтобы показать ценность. В идеале хотелось бы взять какой-то сурьезный опенсорс и встроить туда свою либу. Ну, знаешь, примерно как RW-блокировки на связанных списках встроили в ядро и показали прирост производительности.

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

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

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

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

Публиковать будете?

Когда это можно будет собрать хотя бы не на оффтопе и после минимального приведения в порядок.

Так-то работу с разделяемой памятью как минимум под линь я уже написал, но есть еще объекты синхронизации, которые тоже нужно переписать на futex-ах и eventfd — получится linux-only, соответственно. В принципе, если я покладу болт сейчас на каналы и тупо буду заниматься релизом, то может быть даже в этом году релизну.

Там еще очень тонкая прокладка C-Python, из-за чего реально есть только явное создание ассоциативного массива и списка — объекты уже не поддерживаются, трансляции native-shared нету, примитивных типов тоже только три поддерживается.

Также еще не решена проблема трансляции 64-битных указателей — так-то можно довольно быстро накидать 64-битный релиз, но разделяемая память все равно будет ограничена 32 битами.

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

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

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

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

Блин, ну там-то и реализация только наполовину. У меня на первых порах вообще не было понимания путей реализации, потому приходилось много чего переписывать в итоге. А написано там реально месяца на три fulltime-а при условии понимания задачи и конечной архитектуры.

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

Making python’s dream of multithreading

multithreading

Дальше не читал. Не нужно. Use asyncio, luke.

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

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

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

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

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

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

хотя бы не на оффтопе

Откуда анон о тебе так много знает, точно @metaprog пора звать.

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

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

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

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

это плохой язык, и ни разу не простой на самом дел

Все так говорят, а ты ничего свежего в эту мантру не привнес. Простых языков не бывает.

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

выше я тебе и предложил описать концепцию работы с акцентами там где это нужно, ты проговорил тоже самое на примере реализации cpython.

Но в любом случае исходный код должен быть паблик, если ты конечно не хочешь описывать все и вся и контракты на это все и вся. Иначе вряд ли кто-то будет иметь достаточную картину о том, как решение должно работать.

anonymous
()

It’s like 11k lines of C code already

However, before releasing the code I would be really glad to hear some of your ideas, suggestions, and critique.

Как на счет статической проверки кода каким-нибудь добротным анализатором? Есть ли юнит-тесты? Каково покрытие?

At present moment I’m trying to do some kind of alpha-preview-prerelease as soon as possible, so it can be tested outside of my IDE.

В смысле, там проектные файлы конкретной IDE или еще какая-то привязка гвоздями? Обычно такие вещи принято IDE-независимыми делать.

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

Как на счет статической проверки кода каким-нибудь добротным анализатором?

Есть статические анализаторы для многопоточного кода? С радостью задействую.

Как на счет статической проверки кода каким-нибудь добротным анализатором? Есть ли юнит-тесты? Каково покрытие?

Юнит-тесты в многопоточке — это путь вникуда. Есть несколько вспомогательных тестовых программ, которые активируют работу либы в разных режимах, но сама проверка корректности работы идет изнутри кода.

В смысле, там проектные файлы конкретной IDE или еще какая-то привязка гвоздями? Обычно такие вещи принято IDE-независимыми делать

В том смысле, что я делаю реализацию за минимально возможное время, чтобы проверить предположения. Да, сборка на конкретной IDE — на той самой, на которой я веду отладку.

Обычно такие вещи принято IDE-независимыми делать

Ситуация не является «обычной».

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

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

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

первая ссылка гугла рассказывает про тредсантайзер от того же гугла и цппмем или нахер это все?

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

реализации Python без GIL где-нибудь взлетели?

Нет, конечно. По-взрослому, оно и не может взлететь. Это примерно как васик первых времён.

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

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

Перефразирую: как статический анализ поможет мне узнать, что, например, указатель не будет разыменован после освобождения в другом потоке? Насколько мне известно, по крайней мере в C/C++ это проверяется только рантайм анализаторами.

У меня есть довольно много полиморфных структур (разная структура данных по одному типу указателя) — какой статический анализатор сможет пережевать их?

PS: и что такое ют?

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

первая ссылка гугла рассказывает про тредсантайзер от того же гугла и цппмем или нахер это все?

А оно работает на нескольких процессах с разделяемой памятью?

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

В «The current status of implementation» вы пишите, что хотели бы услышать замечания.
Но тема сложна и при этом архитектура работы потоков не описана.

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

Скорее всего не все алгоритмы возможно эффективно распараллелить.
ИМХО начинал бы решение такого рода задач именно с разработки анализатора исходного кода на пригодность распараллеливания.

Также ИМХО интересна и полезна разработка алгоритмов, которые пригодны для распараллеливания.

PS: Предлагаю вам попробовать использовать уже разработанные библиотеки, предназначенные для возможности распараллеливания потоков.

Владимир

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

PS: Предлагаю вам попробовать использовать уже разработанные библиотеки, предназначенные для возможности распараллеливания потоков.

PS: Предлагаю вам попробовать использовать уже разработанные библиотеки, предназначенные для возможности распараллеливания алгоритмов.

Владимир

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

Но тема сложна и при этом архитектура работы потоков не описана

Там нет «потоков» в классическим их понимании. Потому по всему тексту упоминается понятие «multitasking» вместо «multithreading». Каждая задача — это тупо отдельный интерпретатор. Исправил сразу фразу:

«However, I believe I found a way to make the change as small as possible, keeping most of the usual python code, C extensions, GIL, but introducing a restricted amount of data structures in a shared memory for sharing common data between separate interpreter processes while ensuring their concurrent execution will have the same effect as sequential execution»

Скорее всего не все алгоритмы возможно эффективно распараллелить
ИМХО начинал бы решение такого рода задач именно с разработки анализатора исходного кода на пригодность распараллеливания

Numba занимается этим, но, к сожалению, сорцы питона настолько убоги, что особо их не поанализируешь. Даже простые циклы Numba не может распараллелить — нужно явно объявлять prange. В конце-концов приходится параллелить руками.

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

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

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

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

Numba занимается этим, но, к сожалению, сорцы питона настолько убоги, что особо их не проанализируешь.

Не в «поучение» вас, а о своем подходе к решению задач.

Возьмем к примеру 1С 7.7.
Архитектура /не реализация, а сам подход/ - гениальны!
Но реализация и объекты - «так себе».
Так вот в таких случаях не улучшаю «кривой фундамент», а разрабатываю API, которое может функционировать в любом проекте.

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

Можно ли использовать в Python?
… И не только в нем.

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

Реализация объектной модели Python скорее всего не эффективна.
Отсюда и все проблемы.

Владимир

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

Возьмем к примеру 1С 7.7
Архитектура /не реализация, а сам подход/ - гениальны

В чем? ЯП для создания баз данных для микрокомпьютеров существовали еще в 80-х годах, то есть, с появлением самых первых микрокомпьютеров. MUMPS и вовсе в 1966 появился, но он использовался для больших компьютеров в больших мед учреждениях.

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

В чем? ЯП для создания баз данных для микрокомпьютеров существовали еще в 80-х годах, то есть, с появлением самых первых микрокомпьютеров.

Использование метаданных.
В любой СУБД также использует метаданные /схемы/.
В 1С же можно разработать конфигурацию данных с которой можно эффективно работать.

К примеру даже в 1С 7.7 ТаблицаЗначений может содержать ссылки на любые объекты.
Тем самым легко можно реализовать любое дерево, содержащее данные. Да ведь и сравнительно эффективно работает.
Но 1С метаданные в основном «годятся» для разработки информационных систем не использующих мультимедиа, графику, …

Но сам подход - СУПЕР.

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

Ныне вот фирма 1С реализовала по существу «супер TSQL» и возможность создания диалоговых форм «а-ля вэб».

Там хорошо, но мне туда не надо

Владимир

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

К примеру даже в 1С 7.7 ТаблицаЗначений может содержать ссылки на любые объекты.
Тем самым легко можно реализовать любое дерево, содержащее данные. Да ведь и сравнительно эффективно работает.
Но 1С метаданные в основном «годятся» для разработки информационных систем не использующих мультимедиа, графику

И чем это отличается от dBase, Clipper, MUMPS? Особенно MUMPS, которая в принципе нереляционна.

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

И чем это отличается от dBase, Clipper, MUMPS? Особенно MUMPS, которая в принципе нереляционна.

Дружище, ты же хороший профи.
Мне неловко тебе объяснять.
Подумай.

Владимир

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

даже в 1С 7.7 ТаблицаЗначений может содержать ссылки на любые объекты 7.7 это 2000 год?

А наследовать и создавать новые объекты по прежнему нельзя? Столько времени прошло, а как было беспомощное говно, так и осталось.

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

А наследовать и создавать новые объекты по прежнему нельзя? Столько времени прошло, а как было беспомощное говно, так и осталось.

Они к этому не стремятся.

Сразу предупредил, что 1С «выговаривает не все буквы».
Но сам подход к использованию метаданных хорош.

Конечно 1С не панацея, но в целом ребята - МОЛОДЦЫ!

Владимир

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

В каком это месте они молодцы? О качестве 1С уже говорит тот факт, что за пределами России с ее шизофреннической законодательной базой, вообще никто не использует. В отличие от САП или Дайнемикс.

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

… за пределами России с ее шизофреннической законодательно базой,

То бишь вы с 1С не знакомы вовсе, а суждение имеете.

PS: Объекты бухгалтерского учета можно не использовать и вести разработку любой информационной системы.
Кроме этого 1С легко интегрировать с любой СУБД, …

Владимир

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

О качестве 1С уже говорит тот факт, что за пределами России с ее шизофреннической законодательной базой, вообще никто не использует. В отличие от САП или Дайнемикс

Я бы начал с другого конца. 95% руководителей бизнеса решительно ничего не понимают в этих ваших комплюктерах, и берут софт руководствуясь теми же критериями, что и домохозяйка покупающая пасту бленд-а-мед из телевизора. SAP, например, унаследовал коболоподобный ЯП с глобальными переменными и кучей прибитых гвоздями к языку операторов, которые растягивает время разработки решений на радость программистам-исполнителям. Не говоря уже о том, что там язык в принципе не дружит с GUI, который уже лет так 25 стал мейнстримовым интерфейсом всех систем.

Собстсвенно, отсюда и возник Dynamics — потому что SAP всё больше и больше тормозился наследием. А вот потому что вся финансово-экономическая модель западного капитализма провоцирует на поведение «после нас — хоть потоп», и никто не хочет разгребать технический долг, таща дальше наследие, потому что устранение технического долга значит временное ухудшение финансовых показателей, и не важно, что поддержка наследия уже сожрала в десять раз больше денег, чем переписывание системы с нуля на более современной платформе.

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

Собстсвенно, отсюда и возник Dynamics — потому что SAP всё больше и больше тормозился наследием.

Что действительно удивительно, так то, что для C/C++ за столько лет никто не создал API такое же удобное как многие объекты из 1С.

Владимир

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

Хоть один пример использования не в России и не в химчистке?

Фирма 1С ныне продвигает свою систему в многих странах и рапортуют об успехах /ERP, …/.

Меня этот вопрос не интересует.

Речь ведь не о том, чтобы кому то доказать, что 1С это хорошо, а о том, что подход к использованию метаданных фирмой 1С хорош /но конечно не панацея/.

Владимир

anonymous
()

https://habr.com/en/post/526002/ — Making python’s dream of multithreading come true

Читал, но понял так, что у вас еще проектного решения нет и поэтому вы написали мануал по архитектуре системы.
Ну а так вы молодчина!

С Богом!

Владимир

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

Ээээ /руки крюки/.

Читал, но понял так, что у вас еще проектного решения нет и поэтому вы написали мануал по архитектуре системы.

Читал, но понял так, что у вас еще проектного решения нет и поэтому вы не написали мануал по архитектуре системы.

Владимир

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

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

Владимир

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

… там пока и архитектура под вопросом, есть некоторый концепт того как оно вроде бы должно быть …

Так предыдущий пост как раз об этом и был.

Задача супер!
ТС придется разработать что-то типа OpenPythonMP …

Владимир

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