python mysql结果不一样_使用python多处理时mysql的不同结果

我不知道我做错了什么(或如何改正)。显示一些代码可能更容易一些(从我所做的来看,这有点简化,但它证明了我的观点):from multiprocessing import Pool

import MySQLdb

import sys

#sql connection

try:

conn = MySQLdb.connect (host = "127.0.0.1",user = "user",passwd = "password", db = "mydb")

except MySQLdb.Error, e:

print "Error %d: %s" % (e.args[0], e.args[1])

sys.exit (1)

#with database

cursor = conn.cursor ()

cursor.execute ("DROP TABLE IF EXISTS data_table")

cursor.execute ("""

CREATE TABLE data_table(

value CHAR(80)

) ENGINE=MyISAM

""")

cursor.execute (""" INSERT INTO data_table (value) VALUES ('%s')""" % [0, 0]) #need to insert basecase

conn.commit()

def build_table(i,x): # i is index, x is data[i]

conn = MySQLdb.connect (host = "127.0.0.1",user = "user",passwd = "password", db = "mydb")

cursor = conn.cursor ()

#print i,x

target_sum = 100

for s in range(target_sum + 1):

for c in range(target_sum + 1):

#print c, i

cursor.execute ("""

INSERT INTO data_table (value)

SELECT '%s'

FROM dual

WHERE ( SELECT COUNT(*) FROM data_table WHERE value='%s' )

= 1

AND NOT EXISTS

( SELECT * FROM data_table WHERE value='%s' )

""" % ([s, i+1], [s - c * x, i], [s, i+1]))

conn.commit()

conn.close()

data = [2,5,8]

pool = Pool(processes=4)

for i, x in enumerate(data):

build_table(i,x) #creates 250 records

#pool.apply_async(build_table, (i, x))

pool.close()

pool.join()

print 'completed'

它基本上是在mysql中创建一个表。上面的代码创建了250个条目(这是正确的),但是如果在for循环中注释掉build_table(i,x)并取消注释{},那么它只创建52条记录。为什么对同一个函数进行多重处理时会有差异?我有什么办法可以修复它,从而得到相同的结果(我原以为快速提交更新可以修复它,但运气不好)?在

如果我把pool = Pool(processes=4)改成1,它可以工作,但我想这是意料之中的,因为在那一点上它并不是多处理的。另外,如果有帮助的话,我正在使用InnoDB。在

更新:当我改为MyISAM时,我得到240个结果被更新(不完全是我需要的250个结果,但比52个好得多)。在

UPDATE2:mysql命令被合并到一个命令中,结果似乎有所不同。有时我在数据库中得到248个结果,有时240个或更少。也许多处理导致了预期结果和实际结果之间的差异?在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值