【问题标题】:Set niceness of each process in a multiprocessing.Pool在 multiprocessing.Pool 中设置每个进程的 niceness
【发布时间】:2020-04-22 02:14:49
【问题描述】:

如何在multiprocessing.Pool 中设置每个进程的友好度?我知道我可以使用os.nice() 增加友好度,但是在创建池后如何在子进程中调用它?如果我在映射函数中调用它,它将在每次函数执行时调用,而不是在进程分叉时调用一次。

import multiprocessing as mp    

NICENESS = 19
DATA = range(100000)

def foo(bar):
    return bar * 2

pool = mp.Pool(100)
# Somehow set niceness of each process to NICENESS

pool.map(foo, DATA)

【问题讨论】:

  • 这能回答你的问题吗? Multiprocessing and niceness value
  • @quamrana 很遗憾没有,因为我不想在映射函数中调用它,而是在创建池时调用它。

标签: python multiprocessing nice


【解决方案1】:

为此使用初始化程序怎么样? https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool 我相信该函数在池启动时被调用一次,我猜测初始化程序中的 os.nice() 调用应该适用于之后的过程。

我添加了一些额外的语句来表明它可以在你的工作函数中工作,但是显然应该删除 os.nice() 调用,因为你想要一个静态的 niceness 值。

import multiprocessing as mp
import os

NICENESS = 3
DATA = range(6)


def foo(bar):
    newniceness = os.nice(1) # remove this
    print('Additional niceness:', newniceness) # remove this
    return bar * 2


def set_nicesness(val): # the initializer
    newval = os.nice(val) # starts at 0 and returns newvalue
    print('niceness value:', newval)



pool = mp.Pool(3, initializer=set_nicesness, initargs=(NICENESS,))
# Somehow set niceness of each process to NICENESS
pool.map(foo, DATA)

从打印中可以看出,niceness 现在从 3 开始(我已将其设置为 NICENESS)并从那里开始递增。

【讨论】:

    【解决方案2】:

    您可以通过pool._pool 访问工作进程。 有了这个,您可能可以单独设置每个工人的友好度。

    import time
    import psutil
    import multiprocessing as mp
    NICENESS =19
    DATA = range(15)
    
    def foo(bar):
        time.sleep(bar)
        return bar*2
    if __name__=='__main__':
        pool = mp.Pool(8) # 100 might not make sense if you only have 8 cores
    
        processes = [p.pid for p in pool._pool]
        for pid in processes:
            p = psutil.Process(pid)
            p.nice(NICENESS) # POSIX
            # use this for Windows: 
            # p.nice(psutil.HIGH_PRIORITY_CLASS)
        pool.map(foo, DATA)
    
    

    我无法在 Linux 上测试它,因为我在 Windows 上,但在这里它运行良好。让我知道它是否适用于 Linux。可能是您需要以sudo 的身份运行父进程,因为有些事情无法提升其他进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多