我正在 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 根 6u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 根 7u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 根 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 根 10u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 根 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 根 14u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 根 16u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 根 17u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 根 18u REG 253,0 1143808 1581361 /opt/projects/mail/mvp/db.sqlite3
python 6924 根 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`
应用程序运行时间越长,打开的描述符就越多。有什么解决办法吗?有什么方法可以关闭这个描述符并在池工作人员之后进行清理?