用于计算 pi 的多处理代码永远不会完成

Multiprocessing code to calculate pi never finishes

我想计算圆周率。程序很简单:

  1. 制作一个1x1的正方形,然后在正方形中画一个圆。然后除以 4.
  2. 取两个随机值(x, y)。
  3. 如果 x2 + y2 ≤ 1 则点在圆中。
  4. 重复以上N次
  5. 计算内部点数(我将其称为 K)并除以所有执行次数并乘以四。 (4 * K / N == Pi)

迭代次数越多,计算越准确

为了快速,我使用多处理库。但是多处理代码永远不会完成。有什么问题?

import timeit
start = timeit.default_timer()

import random
from multiprocessing import Pool

N = 1000000
process_num = 4

def make_pi(end):
    count_inbound = 0
    for x in range(end):
        the_x = random.random()
        the_y = random.random()
        if((the_x**2 + the_y**2) <= 1):
            count_inbound += 1
    return count_inbound

# Multiprocessing.
p = Pool(processes = process_num)
count_in = p.map(make_pi, [N/process_num for x in range(process_num)])
print(4*sum(count_in)/N)

# Normal.
##print(4*make_pi(N)/N)

stop = timeit.default_timer()
print(stop - start)

我已经在 mac 上测试了相同的代码。 效果很好。

多进程为 0.25,单进程为 0.45。

只是改变

[N/process_num for x in range(process_num)]

[int(N/process_num for x in range(process_num)]

自己回答。

问题是进程需要关闭。

所以我只加了一行。

if __name__ == "__main__":

我的代码确实有效!

import timeit
start = timeit.default_timer()

import random
from multiprocessing import Pool

N = 1000000
process_num = 4

def make_pi(end):
    count_inbound = 0
    for x in range(end):
        the_x = random.random()
        the_y = random.random()
        if((the_x**2 + the_y**2) <= 1):
            count_inbound += 1
    return count_inbound

if __name__ == "__main__":
    #multiprocessing code
    p = Pool(processes = process_num)
    count_in = p.map(make_pi, [int(N/process_num) for x in range(process_num)])
    print(4*sum(count_in)/N)

    #normal code
    #print(4*make_pi(N)/N)

    stop = timeit.default_timer()
    print(stop - start)