将多进程导入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,甚至塞在那里。为什么?
发布于 2018-07-10 09:54:30
当您的python程序从多个线程内部使用单个conn对象时,它将单个数据库连接上的多个线程的消息流量(线程<==> MySql)混合在一起。这不管用,™。
MySQL连接对象不是线程安全的。每个需要访问MySQL的线程都必须打开自己的连接。(MySQL连接池对象是线程安全的,因此每个线程都可以安全地请求、使用和释放池中的连接。)
Pro提示:当复杂的长寿命软件(如pymysql)的开发人员告诉您它不是线程安全时,请相信他们。
https://stackoverflow.com/questions/51261695
复制相似问题