1

我正在 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`

应用程序运行时间越长,打开的描述符就越多。有什么解决办法吗?有什么方法可以关闭这个描述符并在池工作人员之后进行清理?

4

0 回答 0