我有一个有趣的问题......
在我的编程课程中,我们刚开始查看随机数字,这激发了我对它们做些什么。长话短说,我做了一个程序,使用随机数来相当准确地计算pi。收集一个结果花了很长时间,所以我决定阅读多处理和汇集。我能够修改我的程序以启动一个单独的并行过程来一次计算4个pis,然后对其进行平均。
嗯,该代码工作正常,直到我将其粘贴到我的实验室文件中(我必须上交)
( - 在PyCharm--) 该程序正常工作,直到它到达多处理部分(具体地说,它映射它)。一旦它命中,它将从头开始完全启动我的程序并运行它(进程数)次。我不确定为什么会发生这种情况,因为在映射它时,我特别只针对我的pi函数及其开始的一切。它本身就可以正常工作。 ??
( - 闲置 - ) 在Idle中,程序将正常工作,除非文件中有任何输入。如果有,程序将冻结,永不关闭。
代码:
from random import randrange
from multiprocessing import Process, Pool, Queue
import time
from time import time
from os import getpid
import multiprocessing
def example():
print("Function1")
return
def example2():
print("Function2")
return
example()
example2()
#input()
real_pi = 3.14159265359
def pi1(num: int):
formatStr = 'process id:{} processing pi1({})'
print(formatStr.format(getpid(),num))
in_circle=0
in_square=0
for k in range(1,num+1):
x1=randrange(0,10000000000)
y1=randrange(0,10000000000)
dis=((5000000000-x1)**2+(5000000000-y1)**2)**0.5
in_square+=1
if dis < 5000000000:
in_circle+=1
if in_square == 0:
in_square = 1
pi = 4*in_circle/in_square
print ('process id: {} pi= {}'.format(getpid(),pi))
return pi
if __name__ == '__main__':
cpus=multiprocessing.cpu_count()
x=int(cpus/2)
p = Pool(x)
starts = [500000,500000,500000,500000]
t1 = time()
all_pi = sum(p.map(pi1,starts))
total = len(starts)
average = all_pi/total
t2 = time()
p.close()
print("Time taken: {} seconds".format(t2-t1))
print("Average pi: ", average)
print((((1-real_pi/average)*100)**2)**.5, "% error")
如果您还有其他问题,请与我们联系。