многопроцессорная обработка Python в пользовательской функции - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь порождать несколько процессов одновременно для реализации пользовательских функций кластера в python.Я построил пять функций, которые по сути реализуют поиск по сетке и занимают некоторое время для завершения.Я изучил многопроцессорность и немного адаптировал свой код, но у меня проблемы с двумя вещами.Во-первых, кажется, что процессы все еще происходят последовательно, хотя кажется, что я правильно настроил многопроцессорность.Два, я не могу найти лучший способ получить доступ к значениям, возвращаемым многопроцессорным классом Process. Кажется, что обновление словаря с помощью return является хорошим решением этой проблемы.Так что моя главная проблема в том,правильно ли я настроил многопроцессорность / многопоточность?как я могу проверить?

Приведенный ниже код является упрощенной версией моей текущей структуры

def Optimal_Search(brc = "brc", ms='ms', agg = 'agg', db = 'db', km = 'km'):
    import time
    start_time = time.time()

    def f(name):
        print ('hello', name)
        return ('hello', name)

    if __name__=='__main__':
        brc_params = Process(target = f(name = brc))
        brc_params.start()
        ms_params = Process(target = f(name = ms))
        ms_params.start()
        agg_params = Process(target = f(name = agg))
        agg_params.start()
        db_params = Process(target = f(name = db))
        db_params.start()
        km_params = Process(target = f(name = km))
        km_params.start()

    print("--- %s seconds ---" % (time.time() - start_time))
    print(brc_params, ms_params, agg_params, db_params, km_params)

    return brc_params, ms_params, agg_params, db_params, km_params

1 Ответ

0 голосов
/ 16 февраля 2019

Если вы хотите сделать это с мультипроцессором , я думаю, вам нужно заменить Process(target=f('brc')) на p = Process(target=f, args=('brc', )).В противном случае f будет оцениваться перед передачей в Process.

Однако, похоже, вы хотите, чтобы это выполнялось в кластере, и в этом случае многопроцессорная обработка не будет работать.Я бы предложил написать код с Ray , чтобы он мог работать как на одном компьютере, так и на кластере.

Вы можете структурировать его следующим образом.

import ray
import sys

ray.init()

@ray.remote
def f(name):
    print('hello', name)
    sys.stdout.flush()
    return 'hello', name

# Launch the tasks in parallel on different worker processes.
result_ids = []
for name in ['brc', 'ms', 'agg', 'db', 'km']:
    result_ids.append(f.remote(name))

# Retrieve the results.
results = ray.get(result_ids)

Обратите внимание, что если вы выполняете поиск по сетке или в любой форме поиска гиперпараметров, вы можете найти встроенную библиотеку Ray для настройки гиперпараметров полезной.

Документация для Ray .Заметьте, я помогаю развивать Рэя.

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