因此,我试图编写一个使用django作为ORM的应用程序,因为它既需要做一些后台处理,也需要一个易于使用的前端。它的核心功能是在高CPU进程(基本上是蒙特卡罗模拟)中处理数据库中的数据,我想实现多处理,特别是使用池(我得到4个进程)。基本上我的代码是这样运行的,大约有20个父代的子代:assorted import statements to get the django environment in the script
from multiprocessing import Pool
from random import random
from time import sleep
def test(child):
x=[]
print child.id
for i in range(100):
print child.id, i
x.append(child.parent.id) #just to hit the DB
return x
if __name__ == '__main__':
parent = Parent.objects.get(id=1)
pool = Pool()
results = []
results = pool.map(test,parent.children.all())
pool.close()
pool.join()
print results
有了这样的代码,我会得到间歇的DatabaseErrors或PicklingErrors。前者通常是“格式错误的数据库”或“与MySQL服务器的连接丢失”,后者通常是“无法pickle model.DoesNotExist”。它们是随机的,任何进程都会发生,当然数据库本身也没有问题。如果我设置了pool = Pool(proccesses=1),那么它可以在一个线程中正常运行。我还输入了各种打印语句,以确保大多数语句都在运行。
我还将test更改为:def test(child):
x=[]
s= random()
sleep(random())
for i in range(100):
x.append(child.parent.id)
return x
这只会使每次迭代在运行前暂停不到一秒,而且一切都很好。如果我把随机间隔降到500米左右,它就会开始起作用。可能是并发问题吧?但只有4个进程命中。我的问题是如何在不提前大量转储数据的情况下解决这个问题?我已经用SQLite和MySQL对其进行了测试,但都遇到了问题。