首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多线程中使用相同的db连接后发生了什么?

在多线程中使用相同的db连接后发生了什么?
EN

Stack Overflow用户
提问于 2018-07-10 09:28:01
回答 1查看 1.7K关注 0票数 0
  • 在提出这个问题之前,我已经搜索了很多关于“跨线程共享相同的db连接”的内容。我得到的大多数答案都是否定的,而是使用连接池,但很少有人详细解释为什么我们不能这样做。
  • 然后我用多处理和多线程编写了一个示例代码,我正在尝试找出它,但仍然有一些困难需要解决。我得到的是: 多重处理:

将多进程导入pymysql conn = pymysql.connect(host='localhost',port=3306,user='root',passwd='123456',db='test') def操作( sql ):cur = conn.cursor() cur.execute(sql) cur.close()返回cur.fetchall(4)池= multiprocessing.Pool(4) res = [] for seq (1,3):sql= "SELECT * FROM *FROM user = %d“% seq =pool.apply_async(操作,( res.append(p) pool.close() pool.join() conn.close() for j in res: print(j.get()

正如预期的那样,此代码不能正常工作:

((无,无,1,'ttt','hhh',1,0,''),)# process1 ((None,None,2,'zzz','1256',1,0,''),# process2 (1),这是正常的输出,应该是我们想要的。

((None,None,2,'zzz','1256',1,0,''),( None,None,1,'ttt','hhh',1,0,''),# (2),这是不正确的输出。

跑了很多次,要么是(1)要么是(2)。原因(我认为)是:虽然多进程并行运行,但process1的调用仍然早于process2。对于mysql,哪个进程的查询首先完成还不确定。如果process2 2的连接已经完成,因为它们共享相同的连接,那么连接将按照调用的顺序返回数据,所以我得到了情况(2),否则情况(1)。我说的对吗?

多线程

将multiprocessing.dummy作为多线程导入pymysql从队列导入队列conn = pymysql.connect(host='localhost',port=3306,user='root',passwd='123456',db='test')3):sql = "SELECT * FROM user id = %d“% seq p= pool.apply_async(operate,sql,) pool.close() pool.join() conn.close() print(res.get())

最初,我认为这个代码的结果将是相同的多处理,但结果是不同的。它要么打印process1,要么打印process2,甚至塞在那里。为什么?

  • 将db隔离级别更改为SERIALIZABLE以解决此问题? 我试过了。对于多进程,它似乎是工作的,但对多线程没有影响。理论上应该管用,不是吗?如果是这样的话,我无论如何也不会这么做,但只要设法解决它就行了。
EN

回答 1

Stack Overflow用户

发布于 2018-07-10 09:54:30

当您的python程序从多个线程内部使用单个conn对象时,它将单个数据库连接上的多个线程的消息流量(线程<==> MySql)混合在一起。这不管用,™。

MySQL连接对象不是线程安全的。每个需要访问MySQL的线程都必须打开自己的连接。(MySQL连接池对象是线程安全的,因此每个线程都可以安全地请求、使用和释放池中的连接。)

Pro提示:当复杂的长寿命软件(如pymysql)的开发人员告诉您它不是线程安全时,请相信他们。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51261695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档