Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make sure python script is still running

I have a small script that calculates something. It uses a primitive brute force algorithm and is inherently slow. I expect it to take about 30 minutes to complete. The script only has one print statement at the end when it is done. I would like to have something o make sure the script is still running. I do no want to include prints statements for each iteration of the loop, that seems unnecessary. How can I make sure a script that takes very long to execute is still running at a given time during the script execution. I do not want to cause my script to slow down because of this though. This is my script.

def triangle_numbers(num):
    numbers = []
    for item in range(1, num):
        if num % item == 0:
            numbers.append(item)
    numbers.append(num)
    return numbers

count = 1
numbers = []
while True:
    if len(numbers) == 501:
        print number
        print count
        break
    numbers = triangle_numbers(count)
    count += 1
like image 883
Vader Avatar asked Nov 26 '25 12:11

Vader


2 Answers

You could print every 500 loops (or choose another number).

while True:
    if len(numbers) == 501:
        print number
        print count
        break
    numbers = triangle_numbers(count)
    count += 1
    # print every 500 loops
    if count % 500 == 0:
         print count

This will let you know not only if it is running (which it obviously is unless it has finished), but how fast it is going (which I think might be more helpful to you).

FYI:

I expect your program will take more like 30 weeks than 30 minutes to compute. Try this:

'''
1. We only need to test for factors up to the square root of num.
2. Unless we are at the end, we only care about the number of numbers,
   not storing them in a list.
3. xrange is better than range in this case.
4. Since 501 is odd, the number must be a perfect square.
'''

def divisors_count(sqrt):
    num = sqrt * sqrt
    return sum(2 for item in xrange(1, sqrt) if num % item == 0) + 1

def divisors(sqrt):
    num = sqrt * sqrt
    for item in xrange(1, sqrt):
        if num % item == 0:
            numbers.append(item)
            numbers.append(item / sqrt)
    numbers.append(sqrt)
    return sorted(numbers)

sqrt = 1
while divisors_count(sqrt) != 501:
    if sqrt % 500 == 0:
        print sqrt * sqrt
    sqrt += 1
print triangle_numbers(sqrt)
print sqrt * sqrt

though I suspect this will still take a long time. (In fact, I'm not convinced it will terminate.)

like image 194
Paul Draper Avatar answered Nov 29 '25 01:11

Paul Draper


configure some external tool like supervisor

Supervisor starts its subprocesses via fork/exec and subprocesses don’t daemonize. The operating system signals Supervisor immediately when a process terminates, unlike some solutions that rely on troublesome PID files and periodic polling to restart failed processes.

like image 40
Guy Gavriely Avatar answered Nov 29 '25 01:11

Guy Gavriely



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!