+ -
当前位置:首页 → 问答吧 → 多线程写SQLite3数据库,遇到数据库锁住的问题,问大侠们如何解决?

多线程写SQLite3数据库,遇到数据库锁住的问题,问大侠们如何解决?

时间:2010-12-27

来源:互联网

如果线程数过大,数据库会出现锁住的现象
代码如下:
  1. #!/usr/bin/env python
  2. #-*-coding:utf-8-*-
  3. # 多线程写入数据库测试


  4. # 导入模块
  5. import threading,sqlite3,sys
  6. from time import ctime,sleep


  7. class MyThread(threading.Thread):
  8.     ''' 线程模块 '''
  9.     def __init__(self,func,args,name=''):
  10.         threading.Thread.__init__(self) # 显式调用父类初始化
  11.         self.name=name
  12.         self.func=func
  13.         self.args=args
  14.     def getResult(self):
  15.         return self.res # 返回函数结果
  16.     def run(self):
  17.         print 'starting',self.name,'at:',ctime()
  18.         self.res=apply(self.func,self.args) # 函数结果
  19.         print self.name,'finished at:',ctime()
  20.       
  21. flag=1
  22. def putsql(threadname):
  23.     global flag
  24.     ''' 写入数据库 '''
  25.     while flag:
  26.         con=sqlite3.connect("F:/workspace/test/threadsql.db")
  27.         cur=con.cursor()
  28.         try:
  29.             cur.execute("insert into threadtest (id,name) values (NULL,?)",(threadname,))
  30.         except Exception as E:
  31.             print E
  32.             sleep(5)
  33.         con.commit()
  34.         cur.close()
  35.         con.close()
  36.         print threadname,'Doing'
  37.         #sleep(1)

  38. def setflag(keys):
  39.     global flag
  40.     ''' 捕获键盘输入 用于控制数据库线程退出 '''
  41.     while 1:
  42.         ch = sys.stdin.read(1)
  43.         print ch
  44.         if ch==keys:
  45.             flag=0
  46.             break

  47. def main():
  48.     threads=25
  49.     threadarr=[]
  50.    
  51.     # 放入捕获线程
  52.     t=MyThread(setflag,('q',),setflag.__name__)
  53.     threadarr.append(t)
  54.    
  55.     # 放入工作线程
  56.     for i in range(threads):
  57.         t=MyThread(putsql,(putsql.__name__+str(i),),putsql.__name__)
  58.         threadarr.append(t)
  59.    
  60.     # 启动所有线程
  61.     for i in range(len(threadarr)):
  62.         threadarr[i].start()
  63.    
  64.     for i in range(len(threadarr)):
  65.         threadarr[i].join()

  66.     print  'all DONE'
  67.    
  68. if __name__=='__main__':
  69.     main()
复制代码

作者: hlsd665   发布时间: 2010-12-27

本帖最后由 zhyo 于 2010-12-29 11:00 编辑

回复 hlsd665
好像SQLite是单用户数据库,不能同时有多个线程进行操作。

作者: zhyo   发布时间: 2010-12-29