метод карты Python многопроцессорного пула - PullRequest
0 голосов
/ 29 апреля 2020
def pool_process(f, data, pool_size):
    tp1 = time.time()
    pool = Pool(processes=pool_size)
    result = pool.map(f, data)
    pool.close()
    pool.join()
    print("Results", result)
    print("Overall Time:", round((time.time()-tp1),2))
    return round((time.time()-tp1),2)

def check_prime(num):
    print(multiprocessing.current_process(), multiprocessing.current_process().pid)
    t1 = time.time()
    res = False
    if num > 0:
        for i in range(2,num):
            if (num % i) == 0:
                print(num,"is not a prime number")
                print(i,"times",num//i,"is",num)
                print("Time:", int(time.time()-t1))
                break
        else:
            print(num,"is a prime number")
            print("Time:", time.time()-t1) 
            res = True
    return res

dataRange = range(10000)
pool_process(check_prime, dataRange, 6)

Я пытаюсь проверить эту многопроцессорность в python на ноутбуке Jupiter, программа фактически запустилась с нормальным выводом и просто застыла там через несколько секунд. Я думал, что код где-то застрял, поэтому я использовал ps -elf | grep PID, чтобы проверить состояние одного из процессов после начала выполнения, я получал S почти все время, а иногда и U, который я понятия не имею, что это значит. Тогда, если бы я использовал ps -elf | grep PID, чтобы проверить состояние процесса позже, не было никаких следов, и программа в записной книжке также не закончилась. Я гуглил что-то об этом методе карты и до сих пор не понимаю, что происходит. Цените это, если кто-нибудь может помочь с этим.

1 Ответ

0 голосов
/ 29 апреля 2020

По существу, метод Pool.map принимает в качестве входных данных функцию (скажем, f) и итерируемую (скажем, список [x, y, z]) и применяет эту функцию к каждому элементу в итерируемой, возвращая новую итерируемую (в данном случае [f(x), f(y), f(z)]).

Метод Pool.map отличается от функции vanilla map тем, что Pool.map использует параллелизм, поэтому он является методом объекта Pool. (При желании вы также можете указать параметр «chunksize», чтобы сообщить Python, как вы хотите, чтобы Pool.map разделил работу, так сказать.)

Надеюсь, это поможет!

Соответствующий Python do c: https://docs.python.org/3.8/library/multiprocessing.html#multiprocessing .pool.Pool.map

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