- 论坛徽章:
- 0
|
如果线程数过大,数据库会出现锁住的现象
代码如下:- #!/usr/bin/env python
- #-*-coding:utf-8-*-
- # 多线程写入数据库测试
- # 导入模块
- import threading,sqlite3,sys
- from time import ctime,sleep
- class MyThread(threading.Thread):
- ''' 线程模块 '''
- def __init__(self,func,args,name=''):
- threading.Thread.__init__(self) # 显式调用父类初始化
- self.name=name
- self.func=func
- self.args=args
- def getResult(self):
- return self.res # 返回函数结果
- def run(self):
- print 'starting',self.name,'at:',ctime()
- self.res=apply(self.func,self.args) # 函数结果
- print self.name,'finished at:',ctime()
-
- flag=1
- def putsql(threadname):
- global flag
- ''' 写入数据库 '''
- while flag:
- con=sqlite3.connect("F:/workspace/test/threadsql.db")
- cur=con.cursor()
- try:
- cur.execute("insert into threadtest (id,name) values (NULL,?)",(threadname,))
- except Exception as E:
- print E
- sleep(5)
- con.commit()
- cur.close()
- con.close()
- print threadname,'Doing'
- #sleep(1)
- def setflag(keys):
- global flag
- ''' 捕获键盘输入 用于控制数据库线程退出 '''
- while 1:
- ch = sys.stdin.read(1)
- print ch
- if ch==keys:
- flag=0
- break
- def main():
- threads=25
- threadarr=[]
-
- # 放入捕获线程
- t=MyThread(setflag,('q',),setflag.__name__)
- threadarr.append(t)
-
- # 放入工作线程
- for i in range(threads):
- t=MyThread(putsql,(putsql.__name__+str(i),),putsql.__name__)
- threadarr.append(t)
-
- # 启动所有线程
- for i in range(len(threadarr)):
- threadarr[i].start()
-
- for i in range(len(threadarr)):
- threadarr[i].join()
- print 'all DONE'
-
- if __name__=='__main__':
- main()
复制代码 |
|