Python3.8中的多处理
我第一次尝试在python中使用多处理。我写了一个基本的素数搜索程序,我想在每个核心上同时运行它。问题是:当程序执行多重处理时,它不仅执行“primesearch”功能,而且还执行代码的开头。我的预期输出将是一个介于0和限制之间的素数列表,但它会写入16次(我有16个核和16个进程)“输入限制:” 这是我的密码: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
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算法。
这是否回答了您的问题?这回答了你的问题吗?谢谢你的回答。这只是一个基本程序,我的目标是测试多重处理,而不是搜索大素数。但无论如何,谢谢你的链接,它看起来很有趣!谢谢你的回答。这只是一个基本程序,我的目标是测试多重处理,而不是搜索大素数。但无论如何,谢谢你的链接,它看起来很有趣!那应该是第一个寻找信息的地方:-)那应该是第一个寻找信息的地方:-)