многопроцессорный порядок вывода Python и процессы уничтожения - PullRequest
0 голосов
/ 04 июля 2019

У меня сейчас две проблемы. Во-первых, я пытаюсь привести вывод в порядок. Что касается цикла, я хочу вывод в том же порядке. Я думал об использовании multiprocessing.pool, но не знаю, как добавить Pool в этот код.

Во-вторых, я написал код, который может прервать многопроцессорность, когда я прерываю с помощью "ctrl + c". Иногда это работает, но иногда возникает следующая ошибка:

Во время обработки вышеуказанного исключения произошло другое исключение:

Traceback (последний вызов был последним): Файл "/home/minds/anaconda3/lib/python3.7/multiprocessing/process.py", строка 300, в _bootstrap util._exit_function () Файл "/home/minds/anaconda3/lib/python3.7/multiprocessing/util.py", строка 299, в _exit_function _run_finalizers (0) Файл "/home/minds/anaconda3/lib/python3.7/multiprocessing/util.py", строка 249, в _run_finalizers f = лямбда p: p [0] не является None и p [0]> = minpriority Файл "gpu_monitoring_multiprocessing.py", строка 65, в service_shutdown поднять ServiceExit ServiceExit

from pynvml import *
import multiprocessing
import signal

class Monitor(multiprocessing.Process):
    def __init__(self, device_id, logger=None):
        multiprocessing.Process.__init__(self)
        self.device_id = device_id
        self.logger = logger
        self.exit = multiprocessing.Event()

    def run(self):
        nvmlInit()
        handle = nvmlDeviceGetHandleByIndex(self.device_id)
        usage = nvmlDeviceGetUtilizationRates(handle)

        gpu_util = 0
        memory_util = 0
        j = 0
        while not self.exit.is_set():
            while j < 100:
                gpu_util += usage.gpu
                memory_util += usage.memory
                j += 1
                time.sleep(0.01)
                if j == 100:
                    self.logger.info("device_id : {}".format(str(self.device_id)))
                    self.logger.info("gpu_utility : {}".format(str(gpu_util / j)))
                    self.logger.info("memory_utility : {}".format(str(memory_util / j)))
                    self.logger.info("---------------------------------------------\n")
                    gpu_util = 0
                    memory_util = 0
                    j = 0
                    break

    def shutdown(self):
        print("Shutdown Initiated")
        self.exit.set()

class ServiceExit(Exception):
    pass


def service_shutdown(signum, frame):
    raise ServiceExit

def main():
    ini = utils.get_ini_parameters(INI_FNAME)
    logger = utils.setup_logger_with_ini(ini['LOGGER'], logging_=True, console_=True)

    signal.signal(signal.SIGTERM, service_shutdown)
    signal.signal(signal.SIGINT, service_shutdown)

    logger.info(" # START {}".format(_this_basename_))

    process = []


    nvmlInit()
    deviceCount = nvmlDeviceGetCount()
    logger.info("Total GPU: {}\n".format(deviceCount))

    try:
        for i in range(deviceCount):
            monitor = Monitor(i, logger)
            monitor.daemon = True
            process.append(monitor)
        #
        # processes = [mp.Process(target=func, args=(a, b)) for (a, b) in list]
        # for p in processes: p.start()
        # for p in processes: p.join()
        #
        for i in range(deviceCount):
            process[i].start()

        while True:
            time.sleep(0.5)

    except ServiceExit:

        for i in range(deviceCount):
            process[i].terminate()
            # process[i].shutdown()

        for i in range(deviceCount):
            process[i].join()

        print("--------------------------------------")


    except Exception as e:
        print(e)

if __name__ == "__main__":
    main()

Я ожидаю, что результат будет

device_id: 0
gpu_utility: 16,0
memory_utility: 5,0


device_id: 1
gpu_utility: 16,0
memory_utility: 5,0


device_id: 2
gpu_utility: 16,0
memory_utility: 5,0


device_id: 3
gpu_utility: 16,0
memory_utility: 5,0


device_id: 4 gpu_utility: 16,0
memory_utility: 5,0

что-то вроде этого в каждом цикле, пока я не прерву "Ctrl + C"

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