2015-04-20 96 views
0

我是Python新手,所以,它看起来像我的第一个项目在这个郎。 每当我试图运行我的脚本 - 我从MySQL服务器得到不同的答案。
最常见的答案是OperationalError: (2006, 'MySQL server has gone away') 有时我会得到输出Thread: 11 commited(请参阅下面的代码)。
有时emergency stop(traslated,我在控制台俄罗斯输出)。
无论输出是否满commited - 表中的记录仍然相同。
MySQL服务器已经消失问题

import MySQLdb 
import pyping 
import socket, struct 
from threading import Thread 

def ip2int(addr): 
    """Convert ip to integer""" 
    return struct.unpack("!I", socket.inet_aton(addr))[0] 

def int2ip(addr): 
    """Convert integer to ip""" 
    return socket.inet_ntoa(struct.pack("!I", addr)) 

def ping(ip): 
    """Pinging client""" 
    request = pyping.ping(ip, timeout=100, count=1) 
    return int(request.max_rtt) 

class UpdateThread(Thread): 
    def __init__(self, records, name): 
     Thread.__init__(self) 
     self.database = MySQLdb.connect(host="***", port=3306, user="root", passwd="***", db="dns") 
     self.cursor = database.cursor() 
     self.name = name 
     self.records = records 
    def run(self): 
     print(self.name) 
     for r in self.records: 
      #latency = ping(int2ip(r[1])) what the hell :x 
      #ip = str(int2ip(r[1])) 
      id = str(r[0]) 
      self.cursor.execute("""update clients set has_subn=%s where id=%s""" % (id, id)) 
     self.database.commit() 
     print(self.name + " commited") 

#start 
database = MySQLdb.connect(host="***", port=3306, user="root", passwd="***", db="dns") 
cursor = database.cursor() 
cursor.execute("""select * from clients""") 
data = cursor.fetchall() #All records from DataBase 
count = len(data) 
threads_counter = 10 #We are creating 10 threads for all records 
th_count = count/threads_counter #Count of records for each thread 
last_thread = count % threads_counter #Last records 
threads = [] 

i = 0 
while i < (count - last_thread): 
    temp_list = data[i:(i+th_count)] 
    #print(temp_list) 
    threads.append(UpdateThread(records = temp_list, name = "Thread: " + str((i/3) + 1)).start()) 
    i += th_count 

threads.append(UpdateThread(records = data[i: count], name = "Thread: 11").start()) 

P.S.
我在这里找到的另一个答案不帮助我。

UPD:
我发现一些(每次另一个)线程打印
OperationalError: (2013, 'Lost connection to MySQL server during query')和未来的所有线程打印OperationalError: (2013, 'Lost connection to MySQL server during query')

+0

“MySQL服务器消失”指的是你的数据库连接超时,因为你打开了它,然后开始做别的事情耗时,直到另一件事完成没有与数据库进行交互。 – Hammerite

+0

@Hammerite但脚本正在打开连接,并且每个新线程都在执行此操作。为什么? – Aero

+0

如果只打开一个连接(即只有一个线程),它会工作吗?如果是这样,你看到问题的最小线程数是多少? – Hammerite

回答

0

您需要关闭您的数据库连接,当你与他们所做的,否则DB服务器将变得不堪重负,并使您的连接过期。对于你的程序,我会改变你的代码,这样你只有一个数据库连接。您可以将引用传递给UpdateThread实例,并在完成后关闭它。

database.close() 
+0

感谢您的回答!结果是一样的。它只适用于一个线程。 – Aero