Python: многопроцессорная работающая часть кода, которой не должно быть

Я как бы игрался с многопроцессорностью и различными математическими библиотеками для вычисления числа пи и хотел знать, насколько быстрее это было с многопроцессорностью или без нее при реализации time.perf_counter(). mp.Pool отображает 20 потоков так же, как и количество моих потоков ЦП, при обработке основного он также обрабатывает

etime = time.perf_counter()
print(f"Time Used: {etime - stime:0.4f}sec.\n")

который печатает его 20 раз.

Результат исключен печати в решении:

...
...
...

Time Used: 0.0001sec.

Time Used: 0.0001sec.

Time Used: 0.0000sec.

Time Used: 15.0268sec.
import time
import numpy as np
from mpmath import mp
import multiprocessing as mps

stime = time.perf_counter()
mp.dps = 50
accuracy = 6000000
R = 1


def solve(a):
    n = a
    theta = 360 / n
    rad = mp.radians(theta/2)
    print(n*R*mp.sin(rad))


if __name__ == "__main__":
    pool = mps.Pool(mps.cpu_count())
    pool.map(solve, range(1, accuracy))
    pool.close()
    pool.terminate()
    pool.join()


etime = time.perf_counter()
print(f"Time Used: {etime - stime:0.4f}sec.\n")


person Stream Summer    schedule 24.03.2021    source источник
comment
comment
Нет, это не относится к моей теме.   -  person Stream Summer    schedule 24.03.2021


Ответы (1)


TLDR: чтобы решить вашу проблему, просто сделайте отступ в последних двух строках.

Библиотека multiprocessing фактически запускает весь скрипт Python в каждом потоке. В качестве эксперимента запустите python в том же каталоге, что и программа, и попробуйте импортировать ее. Вы заметите, что два нижних оператора будут выполняться, даже если функция solve не выполняется.

Следовательно, все, что не находится в блоке if __name__ == "__main__":, будет выполняться каждым потоком. Оператор if __name__ == "__main__": указывает Python выполнять этот код только в основном потоке.

Чтобы решить вашу проблему, вам нужно добавить две нижние строки в оператор if.

person Akilan Manivannan    schedule 24.03.2021