之前说到过 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 ,导致结果一直不对,我以为是数据问题。后来在和同学的讨论中恍然大悟。
线程这里的学习,还是要继续研究下去。