我正在Django中开发应用程序,我想在其中使用多处理以执行有效的计算,但不知何故python / Django将打开的文件描述符保持到本地数据库之后会出现错误。
在文件 models.py 我有课:
class VM(models.Model):
name = models.CharField(max_length=30, primary_key=True)
status = models.CharField(max_length=10)
在第二个文件中我得到了:
from multiprocessing.dummy import Pool as ThreadPool
from myapp.models import VM
def multi(vm):
summary = vm.summary
state = summary.runtime.powerState
vm_name = summary.config.name
p=VM(name=vm_name, status = state)
p.save()
方法save()是用于在db中插入行的内置Django.models方法,我认为它会向db打开文件描述符。
def my_function():
x=0
while(x<100):
pool = ThreadPool(3)
pool.map(multi, vms)
pool.close()
pool.join()
x=x+1
sleep(1)`
基本上 my_function 刷新Vms的状态并在数据库中更新它。 我的问题是,即使在关闭池之后,还有db.sqlite3的打开文件描述符,20分钟后我有I / O异常,因为一个文件有超过1000个打开描述符。我不知道为什么Django或python不关闭它。这是lsof命令返回的内容:
[root @ PC~] #lsof | grep db.sqlite3
python 6924 root 6u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 root 7u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 root 8u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 root 9u REG 253,0 2576 1581352 /opt/projects/mail/mvp/db.sqlite3-journal
python 6924 root 10u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 root 11u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 root 12r REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 root 14u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 root 16u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 root 17u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 root 18u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 root 19u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 root 20u REG 253,0 1143808 1581361 / opt / projects / mail / mvp / db.sqlite3`
应用程序运行的时间越长,打开的描述符越多。那有什么解决方案吗?有没有办法关闭这些描述符并在池工作者之后清理?