不小心烧坏了我的电脑.为python计算我们的多处理



这可能是一个相当愚蠢的问题。我在python中闲逛,并决定制作两个版本的素数应用程序,一个只是无限期地计算所有素数,从开始直到你的电脑,一个让用户输入一个数字,然后检查这个数字是否是素数。

所以我做了一个工作很好,但它是相当慢。花了41秒来检查269996535是否是素数。我猜我的算法很糟糕…但这不关我的事!然后我阅读了多处理(多线程),并决定给它一个尝试,经过几分钟的修修补补,我让它在较小的数字上工作,它很快,所以我决定与之前的大数字(269996535)进行比较。我看了看我的警告信,CPU开始飙升,然后音乐停止了,我所有的程序开始一个接一个地崩溃,最后蓝屏。有人能解释为什么会发生这种情况,为什么我不能得到这个工作。我不是在寻找一个更好的算法,我只是想弄清楚为什么我的电脑在尝试多线程时崩溃了。

有效的代码

import time
def prime(x):
start = time.time()
num = x+1
range_num = []
two = x/2
five = x/5
ten = x/10
if not two.is_integer() or five.is_integer() or ten.is_integer():
for i in range(1, num):
y = x/i
if y.is_integer():
range_num.append(True)
else:
range_num.append(False)
total = 0
for ele in range(0, len(range_num)):
total = total + range_num[ele]
if num == 1:
print(1, " is a prime number")
elif total == 2:
print(num-1, " is a prime number")
else:
print(num-1, " is not a prime number")
else:
print(num - 1, " is not a prime number")
print("This took ", round((time.time() - start), 2), "Seconds to complete")

prime(269996535)

把我的电脑炸了的代码

import time
import multiprocessing
global range_num
range_num = []
def part_one(x, denom):
if not denom == 0:
for i in range(1, x):
y = x/denom
if y.is_integer():
range_num.append(True)
else:
range_num.append(False)

if __name__ == '__main__':
start = time.time()
x = int(input("Enter number: "))
num = x+1
range_num = []
if num-1 == 1:
print("1 is a prime number")
for i in range(0, x):
p = multiprocessing.Process(target=part_one, args=(x, i,))
p.start()
for process in range_num:
process.join()
total = 0
for ele in range(0, len(range_num)):
total = total + range_num[ele]
if total == 2:
print(num-1, " is a prime number")
else:
print(num - 1, " is not a prime number")

…我的程序开始一个接一个地崩溃,最后蓝屏。有人能解释一下为什么会这样吗?

您的电脑冷却不足。CMOS逻辑工作越难,产生的热量就越多。当你让它冷却下来后,它很可能会变好。

你的电脑不是唯一过热的。在我的整个职业生涯中,我不得不处理电脑过热的问题。长时间的计算会使我现在用来工作的笔记本电脑关闭,除非我把它放在块上,并在我的桌子上安装一个小风扇,在上面和下面吹风。

如果它是在台式机或塔式机箱,你可以试着把盖子拿下来,用风扇指着它。如果它是一个机架式服务器,那么要么你运行它的房间没有足够的冷却,要么你应该要求退款。


注:如果你需要连接一个裸露的内部硬盘驱动器到你的电脑,一个小的桌面风扇是必不可少的。它们不能在没有强制气流的情况下工作。

这是一个概念验证:

def has_divisors_in_range(number: int, the_range):
for divisor_candidate in the_range:
# If `divisor_candidate` divides `number` evenly,
# then `number` is not prime
if number % divisor_candidate == 0:
return divisor_candidate
return -1
nprocs = 4
processes = [
multiprocessing.Process(
target= has_divisors_in_range,
args=(num, range(t + 1, num + 1, nprocs))
)
for t in range(1, nprocs + 1)
]
# Wait for the processes somehow...

则可以收集所有这些过程的结果,如果它们都是-1,则该数为素数。

最新更新