Многопроцессорность в Python 3,8 - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь использовать многопроцессорность в python впервые. Я написал основную программу поиска c и хочу запустить ее одновременно на каждом ядре. Проблема в том, что когда программа выполняет многопроцессорность, она выполняет не только функцию 'Primesearch', но и начинает код. Мой ожидаемый вывод будет список простых чисел от 0 до предела, но он записывает 16 раз (у меня 16 ядер и 16 процессов) "Введите предел:"

Вот мой код:

import time
import os
from multiprocessing import Process

# Defining lists
primes = []
processes = []
l = [0]


limit = int(input('Enter a limit: '))

def primesearch(lower,upper):
    global primes
    for num in range(lower, upper):
        if num > 1:
            for i in range(2, num):
                if (num % i) == 0:
                    break
            else:
                primes.append(num)


# Start the clock
starter = time.perf_counter()

#Dividing data
step = limit // os.cpu_count()

for x in range(os.cpu_count()):
    l.append(step * (x+1))

l[-1] = limit

#Multiprocessing
for init in range(os.cpu_count()):
    processes.append(Process(target=primesearch, args=[l[init], l[init + 1],] ))

for process in processes:
    process.start()

for process in processes:
    process.join()


#End clock
finish = time.perf_counter()


print(primes)
print(f'Finished in {round(finish-starter, 2)} second')

В чем может быть проблема?

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Вы используете Windows - Если вы прочитаете документацию Python для многопроцессорной обработки, это откроет вам, что вы должны защитить свой основной код с помощью if __name__==“__main__”: Это потому, что на Windows каждый процесс повторно выполняет полный основной файл .py.

Это используется почти во всех примерах в документации и объясняется в разделе «Руководящие указания по программированию».

См. https://docs.python.org/3/library/multiprocessing.html

0 голосов
/ 01 мая 2020

За исключением проблемы __main__, ваш способ использования простых чисел в качестве глобального списка, похоже, не работает. Я импортировал очередь из многопроцессорной обработки и использовал primes = Queue() и

    size = primes.qsize()
    print([primes.get() for _ in range(size)])
    primes.close()

в основной функции и primes.put(num) в своей функции. Я не знаю, лучший ли это способ, для меня это работает, но если N> 12000, консоль зависает. Кроме того, в этом случае использование многопроцессорной обработки на самом деле немного медленнее, чем одного процесса.

Если вы стремитесь к скорости, вы можете тестировать только до квадрата root числа, что экономит примерно половину времени. Есть много оптимизаций, которые вы можете сделать. Если вы тестируете огромные числа, вы можете использовать алгоритм Рабина-Миллера. http://inventwithpython.com/cracking/chapter22.html

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