解释一些Python代码

时间:2011-03-13 18:52:59

标签: python multithreading

这是一个障碍的基本例子,一些线程如何等待进入入口的屏障和另一个出口屏障。
虽然代码很好,但我并不深入了解它是如何工作的...... 例如,我不明白为什么进入barrier()函数的线程在n = n-1之后,可以立即使n = n + 1,从而影响全局n ...?为什么看起来所有的线程在他们使n = n-1停在某处之后,然后他们同步n = n + 1?

import threading
import time
import random
bar1= threading.Semaphore(value=0)
bar2= threading.Semaphore(value=0)
region= threading.Semaphore(value=1)
threads= 10
n= thread
threadlist= []
def usage(x):
    for i in range(2):
        print "[ENTER]: ",x
        barrier()
        print "[EXIT]: ",x
        barrier()

def barrier():
    global bar1,bar2, region,n,threads
    region.acquire();
    n = n - 1;
    if n==0:
        for i in range(threads):
            bar1.release();
    region.release();
    bar1.acquire();
    region.acquire()
    n = n + 1
    if n == threads:
        for i in range(threads):
            bar2.release()
    region.release()
    bar2.acquire()

random.seed()
for i in range(threads):
    thread = threading.Thread(target=usage, args=(i,)) 
    thread.start()
    threadlist.append(thread)
for i in range(len(threadlist)):
    threadlist[i].join()

1 个答案:

答案 0 :(得分:2)

n是仍然必须到达集合点的线程数。 region是一个互斥锁,可以保护对n的访问权限。 bar1bar2是信号量,表示可以继续的线程数,初始化为0.

barrier()的第一部分中,每个主题轮流进入,减少n,并阻塞bar1信号量。要输入的最后一个线程(使n == 0的那个)发布信号量threads次,允许继续执行许多线程。

第二部分与第一部分对称,这次等待最后一个线程增加n