python3中如何在多线程中操作sql server数据库 5C

python37+sql server+win10环境

大概的意思就是,在python中,我开启了n个线程,进入同一个函数,每个线程传递的参数都不一样:如下图:
图片说明
在再每个线程中,将传递过来的参数 update到数据库中,会报一个错误,我想是不是多个线程同时操作一个,导致锁死?如下图:

其中,
conn.connect()我只在程序最开始链接了一次,
conn.cloese(),和cursor.close()只在程序最结尾执行了一次。
每个线程中我试过在函数开头链接数据库,函数结尾关闭数据库,但是应该是串行的,即第一个线程链接数据库,更新数据,第二个线程等待...等到第一个线程关闭连接后,第二个线程才开始链接...
请高手指点一下,应该如何更改代码?

图片说明图片说明

4个回答

你这样就是每执行一次线程,都会连接一次数据库,这样当然会乱了
你把conn =pymsql.connect()和cursor = conn.cursor( )函数放到for i in range(count):语句的上面
然后再func1函数加个cursor的参数传入cursor就行了
这样在开头打开数据库,然后执行多线程把数据放入数据库
然后关闭数据库的语句放在执行线程完了以后,就是最后一行。这样试试看

gjfvip123
gjfvip123 回复lgyt240054: 哦哦,你说的func1加个参数把cursor穿进去,这样也行吗?这个我不太理解,方便加个qq不
2 年多之前 回复
lgyt240054
EuclideanSpace 回复gjfvip123: 是啊,只在开头开启一次,然后不断写入就行了。你放到线程里面,每次执行线程都要开?这样不乱才怪呢
2 年多之前 回复
gjfvip123
gjfvip123 你的意思是把conn =pymsql.connect()和cursor = conn.cursor( )放到循环上边?那不还是开启一次连接吗?
2 年多之前 回复

建议写一个线程池,然后多线程阻塞去操作数据库,保证原子性

多线程同时读写sqlite是可以的,但是需要在所有的sql操作后都要检查返回码,如果是被占用的错误的,要有重试机制就可以了。

gjfvip123
gjfvip123 大哥,你说的检查返回码 是哪些语句?我找不到啊。。。
2 年多之前 回复

第一,你的数据库死锁问题一般来说是可以在ID列加个索引就可以解决了。
第二,你的多线程并不是通常意义上的多线程,只是把每一个update都弄进一个线程里面跑,打个比方,就是别人的
多线程是-线程1:1、2、3,线程2:4、5、6,线程3:7、8、9,而你的多线程就是--线程1:1,线程2:2,线程3:3……当然,这样做并没有
什么问题~
第三,用队列来控制多线程的冲突问题在目前应该是比较好的方法
第四,你的问题可以试一下用pandas的dataframe,to_sql方法来批量插入,会快N多倍。建议研究一下。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问