Skip to content
Advertisement

how to handle big loops in python?

This is more to do with my code as i’m sure i’m doing something wrong

all i’m trying to do is call a main function to repeated itself with a recursive number that at some point i’ll reset.

here is my code

sys.setrecursionlimit(8000)
didMenuFinish = 0

def mainThread(interval):
    time.sleep(0.2)
    print("interval is: " + str(interval))
    
    if (interval < 1650):
        raceTrack(interval)
    if (interval == 1680):
        resetButtons()
        restartRace()


    if didMenuFinish==0:
        mainThread(interval + 1)
    else:
        didMenuFinish = 0
        mainThread(0)

time.sleep(4)
keyboard.press(Key.enter)
keyboard.release(Key.enter)
mainThread(0)

At first the main thread runs fine, but somewhere in the 2500 interval +- it just stops with the error code for stack overflow

Process finished with exit code -1073741571 (0xC00000FD)

I am using Windows and pyCharm

do you know how I can handle that ? or am i doing something wrong ?

Advertisement

Answer

You are most likely recursively looping forever. You recursively call mainThread in these parts:

def mainThread(interval):
    # ...
    if didMenuFinish == 0:
        mainThread(interval + 1)
    else:
        didMenuFinish = 0
        mainThread(0)

But you never return to the caller. You need a base case that stops the recursive loop


Consider this example of a recursive factorial function:

def fac(x):
    if x <= 1:
        return 1
    return x*fac(x-1)

The base case (terminating case) is when x <= 1. and this will be reached eventually as fac(x-1) implies that x is decreasing towards the conditional x <= 1. i.e. you need to have some sort of case where recursion is not needed. Your current function is recursively equivalent to:

def foo():
    foo()

Perhaps infinitely looping and locally updating variables will work?

def mainThread(interval):
    while True:
        time.sleep(0.2)
        print(f"interval is: " {interval})
        
        if interval < 1650:
            raceTrack(interval)
        if interval == 1680:
            resetButtons()
            restartRace()


        if didMenuFinish == 0:
            # No need to call the function again. just change the local variable
            interval += 1
        else:
            didMenuFinish = 0
            # Same here
            interval = 0
Advertisement