python 多线程 join 的 细节问题 注意使用事项

	threads=[]
	f=[fast,slow]
	l=len(f)
	for i in range(l):
		t=MyThread(f[i],(),str(i))
		threads.append(t)
	
	for i in range(l):
		threads[i].start()

	for i in range(l):
		#pass
		threads[i].join()
		print threads[i].getName()
	print "Done on main"
	exit()

join的主要功能是阻塞线程,也就是使用了join后,后面的语句需要等当前进程完成之后才能 执行。


那么看看下面的例子


class MyThread(threading.Thread):
	def __init__(self,fun,arg,name=""):
		threading.Thread.__init__(self)
		self.fun=fun
		self.arg=arg
		self.name=name
		#self.result


	def run(self):
		self.result=apply(self.fun,self.arg)
	
	def getName(self):
		return self.name


	def getResult(self):
		return self.result

上面是一个多线程的类。 待会用来调用的。

下面是main函数

def fast():
	print "in fast"
	sleep(15)
	print "done in fast"

def slow():
	print "in slow"
	sleep(10)
	print "done in slow"

	threads=[]
	f=[fast,slow]
	l=len(f)
	for i in range(l):
		t=MyThread(f[i],(),str(i))
		threads.append(t)
	
	for i in range(l):
		threads[i].start()

	for i in range(l):
		#pass
		threads[i].join()
		print threads[i].getName()
	print "Done on main"
	exit()


运行之后
输出的结果是

in fast
in slow
done in slow
done in fast
0
1
Done on main


看到了吗?


运行到thread[i].join() 这一行, 下一句没有马上被执行,需要等到done in fast 完成之后才执行, 而为什么done in slow却提前被执行了呢?


因为上面执行了threads[i].start() 后 两个线程已经同时开启了,但是由于在slow线程里只sleep了10秒,而fast线程sleep了15秒,所以会先打印done in slow。


print threads[i].getName()

而上面这句则需要等线程1执行之后才会执行,

等执行完了上面那句之后,才会执行线程2的 join(), 由于此时的线程已经早已执行完毕,所以这句也没有起到阻塞作用,故会马上执行 下面只一句


print threads[i].getName()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值