Python3.8中的多处理

Python3.8中的多处理,python,python-3.x,multithreading,multiprocessing,Python,Python 3.x,Multithreading,Multiprocessing,我第一次尝试在python中使用多处理。我写了一个基本的素数搜索程序,我想在每个核心上同时运行它。问题是:当程序执行多重处理时,它不仅执行“primesearch”功能,而且还执行代码的开头。我的预期输出将是一个介于0和限制之间的素数列表,但它会写入16次(我有16个核和16个进程)“输入限制:” 这是我的密码: import time import os from multiprocessing import Process # Defining lists primes = [] proc

我第一次尝试在python中使用多处理。我写了一个基本的素数搜索程序,我想在每个核心上同时运行它。问题是:当程序执行多重处理时,它不仅执行“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')

有什么问题吗?

您使用的是Windows-如果您阅读了用于多处理的Python文档,它会告诉您应该使用
如果uuuu name\uuuuu==“uuu main\uuuu”:
来保护主代码,这是因为在Windows上每个进程都会重新执行完整的main.py文件

这在文档中的几乎每个示例中都有使用,并在“编程指南”的末尾部分进行了解释


请参见您正在使用Windows-如果您阅读了用于多处理的Python文档,它将告诉您应该使用
如果uuu name_uuuuu==“uuu main_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

这在文档中的几乎每个示例中都有使用,并在“编程指南”的末尾部分进行了解释


请参见

除了
\uuuu main\uuuu
问题外,将素数用作全局列表的方法似乎不起作用。 我从多处理导入了队列,并使用
primes=Queue()

    size = primes.qsize()
    print([primes.get() for _ in range(size)])
    primes.close()
将(num)
放入函数中。我不知道这是否是最好的方法,对我来说这是可行的,但是如果N>12000,那么控制台就会冻结。此外,在这种情况下,使用多进程实际上比单进程稍微慢一些

如果您以速度为目标,则只能测试num的平方根,这将节省大约一半的时间。您可以进行许多优化。如果您正在测试大量数据,可以使用Rabin-Miller算法。

除了
\uuuu main\uuuu
问题之外,您使用素数作为全局列表的方式似乎不起作用。 我从多处理导入了队列,并使用
primes=Queue()

    size = primes.qsize()
    print([primes.get() for _ in range(size)])
    primes.close()
将(num)放入函数中。我不知道这是否是最好的方法,对我来说这是可行的,但是如果N>12000,那么控制台就会冻结。此外,在这种情况下,使用多进程实际上比单进程稍微慢一些

如果您以速度为目标,则只能测试num的平方根,这将节省大约一半的时间。您可以进行许多优化。如果您正在测试大量数据,可以使用Rabin-Miller算法。

这是否回答了您的问题?这回答了你的问题吗?谢谢你的回答。这只是一个基本程序,我的目标是测试多重处理,而不是搜索大素数。但无论如何,谢谢你的链接,它看起来很有趣!谢谢你的回答。这只是一个基本程序,我的目标是测试多重处理,而不是搜索大素数。但无论如何,谢谢你的链接,它看起来很有趣!那应该是第一个寻找信息的地方:-)那应该是第一个寻找信息的地方:-)