设置多处理中每个进程的精确性

2024-09-27 09:29:33 发布

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

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

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)

Tags: 函数importdatafoo进程osbarmp
2条回答

用一个初始化器怎么样?https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool 我相信这个函数在池启动时会被调用一次,我猜真好()调用初始值设定项应适用于之后的进程。你知道吗

我添加了一些附加语句来说明它在worker函数中工作,但是真好()显然应该删除调用,因为您需要静态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开始(我为精细度设置了这个值),然后开始递增。你知道吗

您可以通过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的形式运行父进程,因为存在无法提升其他进程的问题。你知道吗

相关问题 更多 >

    热门问题