[Tutor] TimeOut in

somnath chakrabarti chakrabarti.somnath at gmail.com
Sun Nov 8 12:18:36 CET 2009


Hi Python Tutor members,

I have a requirement where I am trying to give a solution for Magic Square
puzzle for sizes ranging from 3 to 5 and using different Solvers. I have the
below MS class derived from Problem class which is defined in constraint.py.
The Problem class has a method called getSolution() which I am overriding in
derived class MS. In MS.getSolution(solver), I am trying to start a
threading.Timer object that will execute MS.onTimeout() method when time
exceeds 100 secs i.e. if there is delay more than 100 secs for the
Problem.getSolution() method, the timer thread will execute onTimeout and
cancel the timer thread.
Once the timer thread is canceled, the control must return back to the
magic_square(n,solver=BacktrackingSolver()) function at the control point
ms.p.join() and it would print the time taken. Finally, it will close the
thread in magic_square.

Below is the code that I have written to do the timeout implementation. But
I am getting error as follows. Can anybody please help me where I am going
wrong?

%%%%%%Error Message %%%%%%%%%%%%%%%%%%%%%%%%%%%

Traceback (most recent call last):
  File "C:\Users\Somnath\Documents\NetBeansProjects\CSC671\src\csc671.py",
line 125, in <module>
<constraint.BacktrackingSolver object at 0x02845F50>
    ms_t.magic_square(size,func_solver())
Magic Square:
None
  File "C:\Users\Somnath\Documents\NetBeansProjects\CSC671\src\ms_t.py",
line 65, in magic_square
    print ms.getSolution(solver)
 Time Exceeded Limit.None
Time Exceeded Limit.
  File "C:\Users\Somnath\Documents\NetBeansProjects\CSC671\src\ms_t.py",
line 39, in getSolution
    self.p = threading.Timer(100, self.onTimeout())
  File "C:\Users\Somnath\Documents\NetBeansProjects\CSC671\src\ms_t.py",
line 52, in onTimeout
    if self.p.isAlive():
AttributeError: 'MS' object has no attribute 'p'
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python26\lib\threading.py", line 525, in __bootstrap_inner
    self.run()
  File "C:\Python26\lib\threading.py", line 477, in run
    self.__target(*self.__args, **self.__kwargs)
  File "C:\Users\Somnath\Documents\NetBeansProjects\CSC671\src\ms_t.py",
line 39, in getSolution
    self.p = threading.Timer(100, self.onTimeout())
  File "C:\Users\Somnath\Documents\NetBeansProjects\CSC671\src\ms_t.py",
line 52, in onTimeout
    if self.p.isAlive():
AttributeError: 'MS' object has no attribute 'p'
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Below is the code -->


from __future__ import generators
from constraint import *
import time
#import thread
import threading
#import sys
#import signal
global t
class MS(Problem):
    start = 0
    end = 0
    def __init__(self,solver=None,size=3):
        Problem.__init__(self,solver)
        Problem.addVariables(self,range(0,size*size),range(1,size*size+1))
        self.addConstraints(size)
        self.solution = {}
    def addConstraints(self,size):
        magic_sum = (size*(size*size + 1))/2

Problem.addConstraint(self,AllDifferentConstraint(),range(0,size*size))
        Problem.addConstraint(self,ExactSumConstraint(magic_sum),[i for i in
range(0,size*size,size+1)])
        Problem.addConstraint(self,ExactSumConstraint(magic_sum),[i for i in
range(size-1,size*(size-1)+1,size-1)])
        for row in range(size):

Problem.addConstraint(self,ExactSumConstraint(magic_sum),[row*size+i for i
in range(size)])
        for col in range(size):

Problem.addConstraint(self,ExactSumConstraint(magic_sum),[col+size*i for i
in range(size)])
    def getSolution(self,solver):
        Problem.setSolver(self,solver)
        self.p = threading.Timer(100, self.onTimeout())
        self.start=time.time()
        self.p.start()
        try:
            self.solution=Problem.getSolution(self)
        finally:
            self.end=time.time()
        self.p.cancel()
    # dummy signal handler for timeout
    def onTimeout(self):
        print None
        print 'Time Exceeded Limit.'
        if self.p.isAlive():
            self.p.cancel()

def magic_square(n,solver=BacktrackingSolver()):
        ms=MS(solver,n)
        print solver
        print 'Magic Square:'
        t = threading.Thread(None,ms.getSolution,None,(solver,),{})
        t.start()
        print ms.getSolution(solver)
        ms.p.join()
        print 'Time taken: %1.3f' % (ms.end-ms.start)
        t.cancel()



-- 
Thanks and regards,
Somnath Chakrabarti.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20091108/8b14ff57/attachment.htm>


More information about the Tutor mailing list