多线程写SQLite3数据库,遇到数据库锁住的问题,问大侠们如何解决?
时间:2010-12-27
来源:互联网
如果线程数过大,数据库会出现锁住的现象
代码如下:
复制代码
代码如下:
- #!/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()
作者: hlsd665 发布时间: 2010-12-27
本帖最后由 zhyo 于 2010-12-29 11:00 编辑
回复 hlsd665
好像SQLite是单用户数据库,不能同时有多个线程进行操作。
回复 hlsd665
好像SQLite是单用户数据库,不能同时有多个线程进行操作。
作者: zhyo 发布时间: 2010-12-29
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28