2016-03-21 5 views
0

Ich schrieb einen Udp Twisted Server und lief es mit dem folgenden Befehl:Twisted-Server abstürzt nach einem Tag

nohup python Udpserver2.py & 

Es ging gut auf dem ersten, aber es brachte einen Fehler und stürzte nach dem 1. Tag. Die Fehlerinformationen in nohup.out ist:

Unhandled Error 
Traceback (most recent call last): 
    File "/usr/lib64/python2.7/site-packages/Twisted-15.4.0-py2.7-linux-x86_64.egg/twisted/python/log.py", line 84, in callWithContext 
    return context.call({ILogContext: newCtx}, func, *args, **kw) 
    File "/usr/lib64/python2.7/site-packages/Twisted-15.4.0-py2.7-linux-x86_64.egg/twisted/python/context.py", line 118, in callWithContext 
    return self.currentContext().callWithContext(ctx, func, *args, **kw) 
    File "/usr/lib64/python2.7/site-packages/Twisted-15.4.0-py2.7-linux-x86_64.egg/twisted/python/context.py", line 81, in callWithContext 
    return func(*args,**kw) 
    File "/usr/lib64/python2.7/site-packages/Twisted-15.4.0-py2.7-linux-x86_64.egg/twisted/internet/posixbase.py", line 597, in _doReadOrWrite 
    why = selectable.doRead() 
--- <exception caught here> --- 
    File "/usr/lib64/python2.7/site-packages/Twisted-15.4.0-py2.7-linux-x86_64.egg/twisted/internet/udp.py", line 248, in doRead 
    self.protocol.datagramReceived(data, addr) 
    File "UdpServer2.py", line 91, in datagramReceived 
    self.device_echo(data, str(host), int(port)) 
    File "UdpServer2.py", line 19, in device_echo 
    cur.execute(sql) 
    File "/usr/lib64/python2.7/site-packages/MySQLdb/cursors.py", line 174, in execute 
    self.errorhandler(self, exc, value) 
    File "/usr/lib64/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away') 

Mein Python-Code UdpServer2.py ist wie folgt strukturiert:

from twisted.internet.protocol import DatagramProtocol 
from twisted.internet import reactor 
import MySQLdb as mdb 

conn = mdb.connect(host='localhost', user='root', passwd='123456', db='kj') 

class KjEcho(DatagramProtocol): 
    def device_echo(self, msg, host, port): 
     device_no = msg[1:7] 
     sql = "select did from device where device_no='%s'" % (device_no) 

     cur = conn.cursor(mdb.cursors.DictCursor) 
     cur.execute(sql)          #line 19 here 

     if 0 == cur.rowcount: 
      ... 
     else: 
      ... 
     cur.close() 

    def startProtocol(self): 
     print 'kj_udp_server starting...' 

    def datagramReceived(self, data, (host, port)): 
     print "receive msg" 
     if(18 != len(data)): 
      print 'len err' 
      return 
     if('0x86' != hex(ord(data[0]))): 
      print '0x86 err' 
      return 
     if(0 == ord(data[15])): 
      print 'from device' 
      self.device_echo(data, str(host), int(port))  #line 91 here 
     else: 
      print 'from mobile' 
      self.mobile_echo(data, str(host), int(port)) 

reactor.listenUDP(6000, KjEcho()) 
reactor.run() 

Linie 91 und Linie 19 sind die Gründe, oben angedeutet, wie man es beheben, danke.

HINWEIS: viele Maschine Es gibt jede Maschine eine Nachricht an den Server können Sie nicht für nicht spezifizierte Zeit auf MySQL-Verbindung (oder eine Buchse für diese Angelegenheit) noch am Leben Relais alle 20 Sekunden

+0

Sieht aus wie Ihr Datenbankserver nicht verfügbar ist –

+0

Der Fehler sagt, dass Ihr MySQL-Server weggegangen ist ... – Mai

Antwort

0

senden, vor allem, wenn keine Daten fließen. Anstatt also eine Verbindung zu verwenden, die Sie einfach zum Abrufen des Cursors verwenden, schließen Sie die Verbindung mit dem Cursor und öffnen Sie sie erneut, wenn Sie sie benötigen.

Also im Grunde wollen Sie diese Zeile

cur = conn.cursor(mdb.cursors.DictCursor) 

Mit einem Präfix, das die conn setzt und dann fügen Sie die folgende

cur.close() 

mit einem, der die conn schließt, höchstwahrscheinlich conn.close().

+0

Ich bin überrascht, der Fehler sagt nicht, Verbindung geschlossen für Inaktivität oder gleich, wenn das der Fall ist, aber hey , MySQLdb wird nicht beibehalten, wenn ich mich richtig erinnere. – Mai

+0

@Mai das ist, wie es für mysql-Bibliotheken in Python AFAIK berichtet wird, habe ich einige von ihnen mit dem gleichen Fehler geworfen geworfen. Sie können mehr lesen auf http://dev.mysql.com/doc/refman/5.7/en/gone-away.html –

+0

Interessant ... das ist etwas irreführend ... Ich denke, das ist nur ich nicht diesen Fehler gesehen . Danke für das Teilen :) – Mai

0

Vielen Dank, Mai und Tymoteusz Paul

class KjEcho(DatagramProtocol): 
    def device_echo(self, msg, host, port): 
     device_no = msg[1:7] 
     sql = "select did from device where device_no='%s'" % (device_no) 

     conn = mdb.connect(host='localhost', user='root', passwd='123456', db='kj') 
     cur = conn.cursor(mdb.cursors.DictCursor) 
     cur.execute(sql) 

     if 0 == cur.rowcount: 
      ... 
     else: 
      ... 
     cur.close() 
     conn.close() 

ich denke, es wird gut, aber für die Verbindung geöffnet und geschlossen häufig es, ist es besser Connection Pool zu benutzen?

+0

Da du meine Antwort benutzt hast, warum hast du sie nicht einfach akzeptiert? –

+0

Ich habe deine Antwort akzeptiert, danke für die Erinnerung, ich bin Anfänger und wusste nicht, wie es geht. – liuhui