Python池多处理启动整个程序

2024-09-24 04:29:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有趣的问题。。。在

在我的编程课上,我们刚开始复习随机数,这启发了我用它们做些什么。长话短说,我做了一个程序,用随机数计算π相当准确。收集一个结果需要很长时间,所以我决定阅读多处理和池。我可以修改我的程序,启动一个单独的并行进程,一次计算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")

如果您还有其他问题,请告诉我。在


Tags: infromimport程序returntimedefpi