Sanity = nil
а че тут английский язык
kostyaBro
Сколько раз мы ещё ему распишем этот алгоритм?)
Sanity = nil
😐
Oleg
thanks for the inspiration
Also , I think that its probably possible to look at unsafe and find something interesting. But it’s unsafe :D
Sanity = nil
Sanity = nil
bloated language, what did u expect?
kostyaBro
Как я писал ему, у тебя есть массивы байт разбросанные по памяти
Melbourne Channel
ok i got the solution. thx all
kostyaBro
Если их надо положить рядышком, их придется переложить
Oleg
Как я писал ему, у тебя есть массивы байт разбросанные по памяти
Я и думал прилинклвать разбросанные адресса к одному )
Oleg
Те , я могу ошибаться , но вроде бы нет же гарантии , что все данные прям лежат в памяти в одном месте ?
Oleg
А. Блен. Это про Мапу было , когда эвакуация
Oleg
Наврал , признаю
Юра (Юрий Александрович)
converting [][]byte to []byte w/o allocation, just via unsafe cast is impossoble. Because []byte can be allocated only in 1 solid range of memory. The structure [][]byte may me (and will be) allocated in several ranges of addresses
Oleg
ok i got the solution. thx all
If you find another great solution than share it with us please. I think that it’s interesting
Юра (Юрий Александрович)
Те , я могу ошибаться , но вроде бы нет же гарантии , что все данные прям лежат в памяти в одном месте ?
Нет гарантии. И скорее всего последовательность адресов не будет непрерывной и упорядоченной.
kostyaBro
Я и думал прилинклвать разбросанные адресса к одному )
Тогда надо идти в пайтон, там вроде есть такое что массив эти может быть односвязный список на самом деле, но ч не вкурсе
Oleg
Нет гарантии. И скорее всего последовательность адресов не будет непрерывной и упорядоченной.
Тогда разве технически мы не можем сами эти адресса по привязывать?
Юра (Юрий Александрович)
Melbourne Channel
If you find another great solution than share it with us please. I think that it’s interesting
ok write our own []byte format []byte{[num or []byte (limited to 255 for 1 byte or 65535 for 2 bytes],[length of 1st []byte],[[]byte 1st []byte total length],[length of 2nd []byte]...],[[]byte 2nd []byte total length],... ) etc.
Melbourne Channel
basically writing your own [][]byte format in []byte
Melbourne Channel
And your own Iteration method ?
yes own iteration method.
Oleg
в каком смысле привязать?
Возможно , что я и правда мало юзал ансейф , но Меняем тип нашего слайса на []byte И итерируемся по нему заменяя в данных хедера слайсов на уже их данные
Oleg
Хедером слайса я назвал структуру из лена, капа и указателя на данные
kostyaBro
Тогда разве технически мы не можем сами эти адресса по привязывать?
Так оно не работает, массив это указатель на начало массива. И ну разве что если ты явно запишешь бацты в конец, похеришь то что было там, потом gc наведет суеты>...)
kostyaBro
Вопрос в том как это все фактически лежит в памяти
Юра (Юрий Александрович)
изменить эти адреса теоретически можно, но куда они будут указывать? От того, что мы просто изменим адреса в системной структуре слайса, сами кусочки памяти, от этого никуда не переедут.
kostyaBro
Мы не про массивы же
Массив внутри слайса
Melbourne Channel
what language are you from
... why does that matter? :)
kostyaBro
Oleg
я не понимаю :(
Это просто мой креатив. Вероятно , что технически все же влетим в стену. У нас был слайс слайсов, состоит из хедеров слайсов. Мы меняем его на слайс , который состоит из указателей на данные этих слайсов. Получаем массив из указателей на данные слайсов , что были ранее
Oleg
Вот. Ансейф поинтер с указателями на хедера слайсов
Oleg
Заменить его на аналогичный, но с указателями на поинтеры на данные хедеров слайсов
Oleg
В каждом хедере же свой указатель на данные
Oleg
И мы можем его достать
Oleg
Грубо говоря произвести замену *header на *header.data
kostyaBro
Да, но как ты собираешься из этого сделать слайс байт
Oleg
Да, но как ты собираешься из этого сделать слайс байт
Какой формат .data у обычныго слайса байт ? Адресса в памяти , где расположены его кусочки ? Если так , то мы это и получим
Oleg
Ммм, тогда меня сбил коммент коллеги про то , что нет гарантии , что все реально лежит в одном месте. И это тогда не сработает
kostyaBro
Я тоже могу ошибаться) Попробую на досуге заалоцировать гигабайт
kostyaBro
Есть же ещё куча абстракций, ОС, свап
kostyaBro
Программа думает что ее память подряд, а по факту нет. Ноооо тут это не должно повлиять
Юра (Юрий Александрович)
Я тоже могу ошибаться) Попробую на досуге заалоцировать гигабайт
Можно. Аллокация происходит в виртуальном адресном пространстве, и в виртуальном адресном пространстве это будут действительно последовательные 1 Гб данных. На какие физические адреса это спроецируется, мы не знаем, и никогда не узнаем, потому что вся программа и весь рантайм работают только с виртуальным адресным пространством. С физическим работает только процессор и диспетчер памяти ОС.
Юра (Юрий Александрович)
Но для нашей задачи это ничего не меняет: слайс байт занимает последовательный отрезок в виртуальном адресном пространстве, слайс слайсов занимает несколько отрезков в виртуальном адресном пространстве, которые могут оказаться несмежными и непоследовательными, и нет способа переноса отрезка с одних адресов ВАП в другие адреса ВАП без их реаллокации.
kostyaBro
Ага, но программа думает что все подряд, и думаю это главное
Юра (Юрий Александрович)
процессор и ОС не позволяют делать "unsafe" операции по пересопоставлению адресов ВАП и ФАП по желанию прикладной программы.
Roman
Доброе утро, если закрыть рутину которая запустила другую рутину, обе рутины будут закрыты?
Илья
нет
Юра (Юрий Александрович)
Доброе утро, если закрыть рутину которая запустила другую рутину, обе рутины будут закрыты?
нет. Порожденная рутина не связана с породившей. Это не похоже на дерево процессов в ОС.
Roman
спасибо
Кіт ✙
Я люблю сырники
Илья
Ага, но программа думает что все подряд, и думаю это главное
есть же приколы с балластами для сборщика: он думает, что на куче 10 гигов, но по факту всё лежит в виртуальной памяти
Юра (Юрий Александрович)
Единственный случай, когда рутина закрывается из-за закрытия другой рутины - это когда закрывается рутина, с которой началось выполнение программы. Ее окончание приводит к завершению всех других рутин, независимо от того, кем они были порождены.
Юра (Юрий Александрович)
есть же приколы с балластами для сборщика: он думает, что на куче 10 гигов, но по факту всё лежит в виртуальной памяти
По факту все не лежит нигде. Потому что память выделена в ВАП, но на ФАП не спроецировано никуда: ни в ОЗУ, ни в файл подкачки
Юра (Юрий Александрович)
Юра (Юрий Александрович)
Но если вы вызовете еще раз main из другой рутины, она не приобретет этих свойств "ведущей" рутины. Хотя это утверждение лучше перепроверить экспериментально.
Юра (Юрий Александрович)
А так можно? 0_о
по идее - да. Функция как функция. Ее можно еще раз вызвать из кода. Непонятно только зачем. Но я этого не проверял.
Roman
по идее - да. Функция как функция. Ее можно еще раз вызвать из кода. Непонятно только зачем. Но я этого не проверял.
Извините, может вы сможете помочь? вообщем перепробовал все что в моих силах, может еще что-то придумаю, но го рутину не закрывает, case <- ctx.Done(): и cancel() работают, но рутина (func new_sub) продолжает работать и выводит сообщение. Посмотрите пожалуйста, https://pastebin.com/2tJvdfan
Юра (Юрий Александрович)
Да, завершение "дополнительного" main не приводит к завершению программы. Пример: https://go.dev/play/p/peMJHO1cjnl
Юра (Юрий Александрович)
Вот это точно появляется в логе? log.Print("cancel use")
Юра (Юрий Александрович)
Подождите, а что это такое: go func() { <-t.callBackChan[userTGID] cancel() log.Print("cancel use") }() go new_sub(ctx, t.messageChan[userTGID], update, t, t.callBackChan[userTGID]) Почему асинхронный вызов new_sub и анонимной функции func() происходят так, без внутренней синхронизации и контроля порядка выполнения?
Юра (Юрий Александрович)
Скорее всего у вас cancel выполняется еще до вызова new_sub.