多线程求π

之前说到过 python 的多线程求 π 问题,但当时并没有贴出代码来。因为确实是之前自己写的那个程序最后结果一直不对,明明逻辑语句都没问题了。

但恰恰是我没有注意到一点,多线程的同步问题。那个求最后总数 N 的值,如果没有进行同步锁的话,那么实际情况将会导致 N 的数量变少。就是因为一个线程未完成另一个线程突然的完成或者一起完成,我是这样认为的,总之一定会导致表面上的 N 大于实际未同步相加的 N 。K 也是在未同步下增加,但毕竟没有一个表面上的准确值。所以 K 小的程度低于 N 的程度。虽然这样说,最直接的原因就还是 N K 的值没有达到目的,导致结果错误

python 的多线程,RLock() 是可以解决这个问题。acquired() 和 release() 控制着线程的同步。它俩之间就用来跑一个功能。

import threading
import random
import math


def circle(n):
    global k
    global count
    m.acquire()
    for i in range(n):
        x = random.random()
        y = random.random()
        distance = math.sqrt((x*x+y*y))
        if distance <= 1:
            k += 1
    count += n
    m.release()

k = 0.0
count = 0.0
threads = []
m = threading.RLock()
n = [354646, 54354564, 654643, 432546, 5436546, 54354, 434563, 25435634, 6535325, 5235325]
for i in range(10):
    t = threading.Thread(target=circle, args=(n[i],))
    threads.append(t)

for t in threads:
    t.setDaemon(True)
    t.start()

for t in threads:
    t.join()

print "最后的π是", 4 * k /count
之前我是真的没有考虑到同步这个问题,没有添加 RLock ,导致结果一直不对,我以为是数据问题。后来在和同学的讨论中恍然大悟。


线程这里的学习,还是要继续研究下去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值