11from  net  import  lib 
22from  sys  import  argv 
3+ from  time  import  time 
4+ from  json  import  dumps 
35from  SocketServer  import  TCPServer , BaseRequestHandler 
46
57
68class  Memory (object ):
79 score  =  None 
810 graph  =  None 
9-  name  =  None 
1011 weight  =  None 
1112 complete  =  False 
13+  start  =  None 
1214
1315 def  __repr__ (self ):
1416 return  str (self .__dict__ )
1517
1618
1719class  MyServer (TCPServer ):
1820 data  =  dict ()
21+  processing  =  1 
1922
2023 def  save (self ):
2124 # TODO: store data to disk 
22-  pass 
25+  print  dumps (
26+  {
27+  key : value .__dict__ 
28+  for  key , value  in  self .data .iteritems ()
29+  }, indent = 4 
30+  )
2331
2432
2533class  MyTCPHandler (BaseRequestHandler ):
@@ -30,16 +38,25 @@ def send(self, msg):
3038 lib .send (self .request , msg )
3139
3240 def  handle_start (self ):
33-  name  =  argv [1 ] if  len (argv ) >  1  else  None 
41+  name  =  None 
42+  if  len (argv ) >  self .server .processing :
43+  name  =  argv [self .server .processing ]
3444 weight  =  0 
3545 if  name :
3646 weights  =  [1.2 , 1.1 , 1.08 , 1.04 , 1 ]
3747 try :
3848 memory  =  self .server .data .setdefault (name , Memory ())
49+  if  memory .complete :
50+  # If we are done, move on 
51+  self .server .processing  +=  1 
52+  return  self .handle_start ()
53+ 
3954 weight  =  max ([
4055 w  for  w  in  weights 
4156 if  not  memory .weight  or  memory .weight  >  w 
4257 ])
58+  if  not  memory .start :
59+  memory .start  =  time ()
4360 except  Exception :
4461 name  =  None 
4562 self .send ((name , weight ))
@@ -54,11 +71,12 @@ def handle_end(self):
5471 data .score  =  score 
5572 data .graph  =  graph 
5673 data .weight  =  weight 
57-  data .name  =  name 
5874 print  'New best score of {} for {}' .format (score , name )
5975 if  weight  <=  1 :
6076 print  'Completed Search on {}' .format (name )
6177 data .complete  =  True 
78+  data .duration  =  time () -  data .start 
79+  del  data .start 
6280 self .server .save ()
6381 else :
6482 print  'Worse score of {} for {}' .format (score , name )
@@ -78,7 +96,10 @@ def handle(self):
7896 'P' : self .handle_ping 
7997 }
8098 command  =  self .request .recv (1 )
81-  print  'Client {1}:{2} said "{0}"' .format (command , * self .client_address )
99+  if  command  !=  'P' :
100+  print  'Client {1}:{2} said "{0}"' .format (
101+  command , * self .client_address 
102+  )
82103 if  command  in  obj :
83104 obj .get (command , lambda : 0 )()
84105 else :
@@ -87,4 +108,9 @@ def handle(self):
87108if  __name__  ==  "__main__" :
88109 server  =  MyServer ((lib .HOST , lib .PORT ), MyTCPHandler )
89110 print  'Serving at {}:{}' .format (* server .server_address )
90-  server .serve_forever ()
111+  try :
112+  server .serve_forever ()
113+  except  KeyboardInterrupt :
114+  print  'Killing server' 
115+  server .server_close ()
116+  server .shutdown ()
0 commit comments