我不知道我做错了什么(或如何改正)。显示一些代码可能更容易一些(从我所做的来看,这有点简化,但它证明了我的观点):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个或更少。也许多处理导致了预期结果和实际结果之间的差异?在