Ограничить количество ядер в недемоническом пуле Python - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть скрипт, в котором я запускаю некоторые процессы с помощью pool.apply_async и запускаю их как недемон, чтобы избежать проблем, связанных с процессами «зомби», перегружающими память.До сих пор это работало хорошо, за исключением того, что теперь я увеличил набор данных в памяти, поэтому, используя все свои ядра, я увеличиваю объем памяти.Я хочу ограничить количество ядер, используемых в этих случаях, но не могу заставить его работать

Обычно я бы интегрировал что-то вроде следующего

    pool = Pool(self.nb_cores)

, чтобы ограничить количество ядер,Однако я не могу выяснить, где его интегрировать в процесс, отличный от процесса.

import multiprocessing
import multiprocessing.pool

class NoDaemonProcess(multiprocessing.Process):
    """
    Extends the multiprocessing Process class to disable
    the daemonic property. Polling the daemonic property
    will always return False and cannot be set.
    """

    @property
    def daemon(self):
        """
        Always return False
        """
        return False

    @daemon.setter
    def daemon(self, value):
        """
        Pass over the property setter

        :param bool value: Ignored setting
        """
        pass

class NoDaemonContext(type(multiprocessing.get_context())):
    """
    With the new multiprocessing module, everything is based
    on contexts after the overhaul. This extends the base
    context so that we set all Processes to NoDaemonProcesses
    """

    Process = NoDaemonProcess

class NoDaemonPool(multiprocessing.pool.Pool):
    """
    This extends the normal multiprocessing Pool class so that
    all spawned child processes are non-daemonic, allowing them
    to spawn their own children processes.
    """

    def __init__(self, *args, **kwargs):
        kwargs['context'] = NoDaemonContext()
        super(NoDaemonPool, self).__init__(*args, **kwargs)

Я знаю, что мне нужно где-то интегрировать ограничение количества ядер ... просто не могу найтиТочная функция мне нужна в моем контексте.

1 Ответ

0 голосов
/ 24 сентября 2019

Ваш пользовательский класс NoDaemonPool является производным от multiprocessing.pool.Pool, поэтому он может принять processes (количество рабочих процессов, которые нужно использовать) в качестве аргумента ключевого слова:

pool = NoDaemonPool(processes=nb_cores)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...