Форум сайта python.su
OlezhkaПри любой рекурсии оно висит в памяти, пока вызовы не завершились. Почему для root.after() нельзя применять рекурсию - потому что эти вызовы бесконечны. То есть ты один раз жмёшь на кнопку и они после этого одного нажатия всё запускаются и запускаются через каждую секунду, не завершаясь никогда. То есть оно мало того что в памяти висит постоянно и ещё и растёт в памяти по мере появления новых вызовов, так оно ещё и дойдёт таким образом до лимита рекурсии в конце концов и выпадет. В разных языках разный лимит рекурсии; только не во всех языках он в количестве выражается, как в питоне. Но суть в том, что эти вызовы будут повторяться и повторяться и при этом всё висеть и висеть.
Или это засирание происходит только при использовании “root.after()”?
Офлайн
py.user.nextА как же тогда написать простейшие часы, которые будут каждую секунду выводить текущее время, если не пользоваться самозацикливанием рекурсивным функции “tick()” с помощью “root.after(1000, tick)”?!
Рекурсию можно применять только тогда, когда она неглубокая (не бесконечная) и когда она строго определена и вызовы завершаются гарантировано.
Отредактировано Olezhka (Янв. 6, 2023 16:51:47)
Офлайн
А про симафор я имел ввиду вот что:
stop = 0 def work(str_): global stop len_ = len(str_) - 1 curr = 0 while stop == 0: print(str_[curr]) curr += 1 if curr == len_: curr = 0 work('gfwer43t54t5t555555555555555555555555555555'+ '5555555555555555555555555555555555555555555'+ 'hfghfghghfghgjuykukki878ki78ki8787ik78i55555') print('end')
Офлайн
OlezhkaУ тебя tick() должна запуститься, отработать и выйти сразу. Внутри tick() нельзя вставлять эту строку.
А как же тогда написать простейшие часы, которые будут каждую секунду выводить текущее время, если не пользоваться самозацикливанием рекурсивным функции “tick()” с помощью “root.after(1000, tick)”?
while True: root.after(1000, tick)
OlezhkaСкорее всего, ты столкнёшься с тем, что stop вычислится один раз и будет иметь такое значение потом постоянно при каждой проверке в while. Семафор обычно сложнее устроен и обрабатывается он не просто одной проверкой какой-то. Поэтому и ставят таймеры, а к таймерам уже привязывают проверки.
И цикл в теле функции (без всякой рекурсии) будет выполняться, пока какая-то другая функция не изменит значение симафора на “stop = 1”.
Офлайн
py.user.nextСпасибо! Буду знать!
У тебя tick() должна запуститься, отработать и выйти сразу. Внутри tick() нельзя вставлять эту строку.
Отредактировано Olezhka (Янв. 6, 2023 23:11:08)
Офлайн
OlezhkaДа, для этого нужна многопоточность. Все независимые элементы разносятся по разным потокам и таким образом работают одновременно. Происходит постоянное быстрое переключение от одного потока к другому. Поэтому кажется, что они работают одновременно. А уже передача информации какой-то налаживается между потоками через какие-то средства, которые для потоков подходят (трубы, семафоры, таймеры, неблокирующие очереди и так далее). Абстракций там много всяких.
А как быть с тем, что после вызова функции управление на следующий кадр не передается, пока функция не завершится? Я так понимаю, даже цикл “while” после вызова функции остановится и не пойдет дальше (управление не передастся), пока функция не отработает? И как же этот момент обойти? Учить и юзать “threads”?
Офлайн
py.user.nextСпасибо! Ясно. Короче, это ЦЕЛЫЙ МИР! ЮУТУБ Как и “tkinter”!
А уже передача информации какой-то налаживается между потоками через какие-то средства, которые для потоков подходят (трубы, семафоры, таймеры, неблокирующие очереди и так далее). Абстракций там много всяких.
Офлайн