Django - 文件描述符可能泄漏?

时间:2015-06-10 08:11:58

标签: python django python-2.7 multiprocessing lsof

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

应用程序运行的时间越长,打开的描述符越多。那有什么解决方案吗?有没有办法关闭这些描述符并在池工作者之后清理?

0 个答案:

没有答案