如何在multiprocessing.Pool中为每个进程设置精美程度?我知道我可以使用os.nice()增加美感,但是创建池后如何在子进程中调用它呢?如果我在映射函数中调用它,则函数每次执行时都会被调用,而不是在进程进行 fork 时被调用。

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)

最佳答案

那用一个初始化器呢? https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool
我相信该函数在池启动时会被调用一次,而且我猜想初始化器中的os.nice()调用之后应该对过程起作用。

我添加了一些其他语句来表明它可以在您的worker函数中使用,但是显然您应该删除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)

从打印品中您可以看到,精美度现在从3开始(我已经将其设置为NICENESS),并从那里开始递增。

关于python - 在多处理中设置每个流程的精细度。,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59579859/

10-12 15:28