最近做python,下面是一段测试数据库性能的代码。
数据库表记录:1000000条。
开200个线程,100个同时并发。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import os
import os.path
import re
import MySQLdb
import httplib, mimetypes
import traceback
import logging
import ConfigParser
import time
import threading
import string
import codecs
import random
import datetime
class SelectView(threading.Thread):
def __init__(self, threadName):
threading.Thread.__init__(self, name = threadName)
def run(self):
#global dbConn
#dbConn = MySQLdb.connect(host=dbhost, port=dbport, user=dbuser, passwd=dbpass, db=dbschema, use_unicode=True, charset='utf8')
for i in range(100):
start =time.time()
print self.getName(),"-->Thread start!"+getDbDateString()
logger.info(self.getName()+"-->Thread start!"+getDbDateString())
try:
dbConn = None
dbConn = MySQLdb.connect(host=dbhost, port=dbport, user=dbuser, passwd=dbpass, db=dbschema, use_unicode=True, charset='utf8')
strss = string.join(random.sample(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','T','Z'], 1)).replace(" ","")
#print "query str----"+strss
sql = "SELECT * FROM smartone_metainfo_view as s where songName like '%"+strss+"%' limit 200"
cursor = dbConn.cursor()
cursor.execute(sql)
songid =""
for counts in cursor.fetchall():
songid= songid + str(counts[0])+str(counts[1])+str(counts[2])+str(counts[3])+str(counts[4])+str(counts[5])+str(counts[6])+str(counts[7])+str(counts[8])+str(counts[9])+str(counts[10])+str(counts[11])+str(counts[12])+str(counts[13])+str(counts[14])+str(counts[15])+ str(counts[16])+str(counts[17])+str(counts[18])+str(counts[19])+str(counts[20])+str(counts[21])+str(counts[22])+str(counts[23])+str(counts[24])+str(counts[25])+str(counts[26])+str(counts[27])+str(counts[28])+str(counts[29])+str(counts[30])+str(counts[31])
end =time.time()
sec = end - start
print " thread,execute total time is----",sec," second"
logger.info(" thread execute finish,execute total time is----"+str(sec)+" second")
print songid
#print "size --"+str(len(counts))+"songId---"+str(counts[0])# self.getName(),"--query result:--total count--"+str(counts[0])#+"----songName:"+counts[1]+"----isrc"+str(counts[2])
#logger.info("size --"+str(len(counts))+"songId---"+str(counts[0]))
#print "command free----",os.system('free')
dbConn.close()
except:
etype, evalue = sys.exc_info()[:2]
logger.info(self.getName()+"--Thread,-query data failed!---Type: " +str(etype)+"----Value--:"+str(evalue))
print "Type: " , etype
print "Value: " , evalue
#cmd = "mysqladmin -uMELODEO_USER -p6DF0FF9674EC1A397A430F9F2FCB2C64 -h202.153.121.172 status"
# strs = os.system(cmd)
#lines = os.popen(cmd).readlines()
#for line in lines:
# print line.rstrip()
#logger.info("".join(lines))
#sem.release()
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
def init_settings(profile, config_file):
#read ini file
# config_file = "c:/contentstext/processCommonFormat.ini"
# print os.getcwd()
cfg = ConfigParser.RawConfigParser()
cfg.read(config_file)
#define the directory we are writing out to and some other parameters.
global dbhost
dbhost = cfg.get(profile, "dbhost")
global dbport
dbport = int( cfg.get(profile, "dbport"))
global dbuser
dbuser = cfg.get(profile, "dbuser")
global dbpass
dbpass = cfg.get(profile, "dbpassword")
global dbschema
dbschema = cfg.get(profile, "db")
global USE_UNICODE
try:
use_unicode = cfg.get(profile, "USE_UNICODE")
if (use_unicode == 'Y'):
USE_UNICODE=True
else:
USE_UNICODE=False
except:
USE_UNICODE=False
#set up logs - ripped from contentManager.py
LOG_FILE = './smartone_200.log'
val = cfg.get(profile, "loglevel") # The configured log level
if len(val) >0:
if val == 'debug':
log_level = logging.DEBUG
elif val == 'info':
log_level = logging.INFO
elif val == 'warning':
log_level = logging.WARNING
elif val == 'error':
log_level = logging.ERROR
elif val == 'critical':
log_level = logging.CRITICAL
else:
log_level = logging.INFO
val = cfg.get(profile, "log_format") # The format string for this logging session
if len(val) >0:
log_format = val
else:
log_format = '%(asctime)s %(levelname)s %(message)s'
###################
# Initialize logger
global logger
logger = logging.getLogger('sessioninfo')
hdlr = logging.FileHandler(LOG_FILE)
formatter = logging.Formatter(log_format)
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(log_level)
def getDbDateString():
now = datetime.datetime.today()
#should probably do this using a formatting string - don't feel like reading docs.
return str(now.year) + "-" + str(now.month) + "-" + str(now.day) + " " + str(now.hour) + ":" + str(now.minute) + ":" + str(now.second)
if __name__ == "__main__":
config_file = "./smartone_DataTest.ini"
profile = "smartone"
init_settings(profile, config_file)
maxThread = 200
#threading.
import socket
socket.setdefaulttimeout(15)
threadList=[]
#threading.BoundedSemaphore(maxThread)
for i in range(maxThread):
#sv = SelectView()
threads = SelectView('thread'+str(i))
threadList.append(threads)
#threadList.remove(len(threadList))
print '/nStarting threads'
for i in threadList:
i.start()
print 'All threads started/n'
for i in threadList:
i.join()
print "All thread has create,Wait for all thread exit."
#
#sv.executeThread()
# sv = SelectView()
# cout = sv.selectView()
# print "wewe----",cout