Python模拟线程并发

最近做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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值