BaseAgent.__init__(self)
try:
self.process = subprocess.Popen(externName, stdin=subprocess.PIPE,
- stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+ stdout=subprocess.PIPE,
universal_newlines=True)
except Exception, e:
print ("Error spawning \"%s\": " % externName), e
-
+
+ self.process.stdin.write ( ' '.join( ["HI", repr(self.GetID()), "\r\n"] ) )
+
def stringToItem( self, str ):
if str == "Rock":
return Rock
return attack, bluff
except:
#agent is insane
- print "Agent is insane:", self
+ print "Agent is insane:", self, self.GetID()
pass
def Defend (self, foe, bluff ):
return defence
except:
#agent is insane
- print "Agent is insane:", self
+ print "Agent is insane:", self, self.GetID()
pass
def Results (self, foe, isInstigatedByYou, winner, attItem, defItem, bluffItem, pointDelta):
self.process.stdin.write ( string )
self.process.stdout.readline() # read and discard (should be "OK")
+ # we kill off the process here because otherwise the class doesn't get
+ # destroyed until the end of the iteration. This causes us to hold more
+ # than MAX_TOTAL_AGENTS open for a period of time, which is a bad thing.
+ if self.IsDead():
+ try:
+ self.process.communicate( "BYE\r\n" )
+ except Exception, e:
+ print "Error in BYE:", self, ":", e
+
+ try:
+ self.process.kill()
+ except:
+ None
+
+
def __del__(self):
- try:
- self.process.communicate( "BYE\r\n" )
- except Exception, e:
- print "Error in BYE:", self, ":", e
+ #unless we're being deleted unexpectedly, this is a no-op.
+ if self.process.poll() == None:
+ try:
+ self.process.communicate( "BYE\r\n" )
+ except Exception, e:
+ print "Error in BYE:", self, ":", e
- try:
- self.process.kill()
- except:
- None
\ No newline at end of file
+ try:
+ self.process.kill()
+ except:
+ None