Finally, I wrap add_timeout and even self._stream.write to add_callback func.
def writeToDevice(self,tmp_dict,sendno):
self.lock.acquire()
self.to_device = tmp_dict
mess_context = json.dumps(tmp_dict['msg_content'])
mess_id = hashlib.new('md5',mess_context).hexdigest()
self.sendno_messid[str(sendno)]=mess_id
if self.status != '0' and ADPNS_with_db:
if use_dbapi:
dbwrite(tablename=db_tbs['message_detail'],mess_id=mess_id,device_token=self._devicetoken,mess_status='2')
else:
messages_details_writer.dbwrite(mess_id=mess_id,device_token=self._devicetoken,mess_status='2')
logger.log(20,'When writing to %s(%s:%s),status not 0(%s)'%(self._address,self._devicetoken,sendno,self.status))
self.lock.release()
return
data = self.genMsgToDevice(self._devicetoken,tmp_dict)
#self.timer = Timer(settings.retry_interval,self.feedback_timeout_handle)
#self.timer.start()
#self.timeouter = self.io_loop.add_timeout(datetime.timedelta(seconds=settings.retry_interval), lambda : self.feedback_timeout_handle(sendno))
self.addTry(sendno)
#self.addTimer(sendno)
self.addTimer(sendno,mess_id)
try:
#if self.retry == 0:
if self.getTry(sendno)==0:
#print '****************',self.getTry(sendno)
#self._stream.write(data,self.wait_feedback)
self.io_loop.add_callback(self._stream.write,data,self.read_message)
#self._stream.write(data,partial(self.read_message,sendno, mess_id))
#self._stream.write(data,lambda : self.read_message(sendno, mess_id))
#for hang debug
if debug_hang:
logger.log(10,'sendno:%s written to device:%s for first time' % (sendno,self._devicetoken))
else:
self.io_loop.add_callback(self._stream.write,data)
#self._stream.write(data)
#for hang debug
if debug_hang:
logger.log(10,'sendno:%s written to device:%s for latter time' % (sendno,self._devicetoken))
except StreamClosedError,e:
logger.log(30,'When writing, stream closed to %s(%s)' % (str(self._address),self._devicetoken))
#self.io_loop.remove_timeout(self.timeouter)
self.lock.release()
self.delTimer(sendno)
self.delTry(sendno)
except Exception,e:
logger.log(30,'When stream writing to %s(%s:%s),exc:%s' % (str(self._address),self._devicetoken,sendno,e))
#self.io_loop.remove_timeout(self.timeouter)
try:
self.lock.release()
except Exception,e:
logger.log(30,'writetodevice:lock release exc:%s. device:%s,sendno:%s'%(e,self._devicetoken,sendno))
self.delTimer(sendno)
self.delTry(sendno)
Problem hit before are gone.
However, the performance decreases to 1/3.
Line in pink is new code while those in red is old one which has better performance.
Is there any way to improve the performance?
Wesley
在 2014年4月9日星期三UTC+8上午9时06分54秒,Ben Darnell写道: