如何限制Python进程的I/O消耗(可能使用ionice)?

2024-10-02 10:30:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望一组特定的Python子进程的影响尽可能低。我已经在使用nice来帮助限制CPU消耗。但理想情况下,I/O也会受到限制。(如果怀疑,请幽默我,并假设这样做是有价值的;不管它们运行多长时间,它们可能有很多,而且在同一台机器上有更高优先级的东西,等等)

一种可能是ionice。是否有任何现有的Python包用于调用ionice(Google没有发现任何东西)?编写代码来简单地运行ionice命令并不困难;但我更愿意避免编写其他人编写/测试过的代码;有时会出现一些微妙的边缘情况,等等,还有没有更好的方法来限制I/O消耗?在

man page for ionice表明ionice值可能受nice值的影响,但是运行这个Python 2.6脚本似乎证明了这一点,即使对于继承了nice值的子进程:

#!/usr/bin/env python

import os
import multiprocessing

def print_ionice(name):
    print '*** ', name, ' ***'
    os.system("echo -n 'nice: '; nice")
    os.system("echo -n 'ionice: '; ionice -p%d" % os.getpid())

for niced in (None, 19):
    if niced: os.nice(niced)
    print '**** niced to: ', niced, ' ****'
    print_ionice('parent')
    subproc = multiprocessing.Process(target=print_ionice, args=['child'])
    subproc.start()
    subproc.join()

其输出如下:

^{pr2}$

Tags: 代码nameimportfor进程os情况multiprocessing
3条回答

{{{cd2>你应该找到一个/usr/include/asm/unistd_32.h或/usr/include/asm/unistd_64.h,这取决于您的内核架构;如果没有,请从syscall(2)手册页的建议开始,该页面应该是/usr/include/sys/syscall.h,然后逐步向下包括。在

考虑到你应该使用:

def ioprio_set(which, who, ioprio):
    rc= ctypes.CDLL('libc.so.6').syscall(289, which, who, ioprio)
    # some error checking goes here, and possibly exception throwing

差不多就是这样。玩得开心:)

psutil公开了此功能(python 2.4->;3.2):

import psutil, os
p = psutil.Process(os.getpid())
p.ionice(psutil.IOPRIO_CLASS_IDLE)

另外,从Python 3.3开始,Python stdlib中也会提供: http://bugs.python.org/issue10784

为什么不让任何启动的进程都对它们执行离子冰操作(即,用离子冰运行它们),而不是让它们自己运行呢?看起来干净多了。在

相关问题 更多 >

    热门问题