代码如下:
import time
from threading import Thread
import threading
class Test:
#set the max thread number
threadLimiter = threading.BoundedSemaphore(10)
def go(self):
lstRecordThreads = []
for i in range(1, 200):
Test.threadLimiter.acquire()
try:
recordThread = Thread(target=self.recordExec, args=(i,))
recordThread.start()
time.sleep(0.25);
lstRecordThreads.append(recordThread)
finally:
Test.threadLimiter.release()
for rt in lstRecordThreads:
rt.join()
def recordExec(self, number):
print "current number=["+str(number)+"]"
time.sleep(12);
print "done=["+str(number)+"]";
t = Test()
t.go()
但是结果是线程数量不受BoundedSemaphore
中的数字设置的限制。有人能给我解释一下这个场景吗?在
当当前子线程数已经是10时,为什么主线程在代码Test.threadLimiter.acquire()
处挂断?谢谢!在
没有理由相信信号灯坏了。不清楚的是为什么你不这么认为,你的主循环不会等待任何东西——它会以最快的速度触发线程,在两次尝试之间休眠四分之一秒。在每次迭代中,它都会释放sempahore。所以:
等等等等。事实上,信号量计数永远不会低于9!每次你获得它,你在试图再次获得它之前就释放了它。在
对不起,我猜不出你打算做什么。在
正如@Tim Peters所说,在你的主线程中,你获取一个信号量,创建一个线程,释放这个信号量,然后重复这个过程200次,这不会将信号量的数量减少到0。在
如果你想控制创建的线程数,在主线程中,你应该先获取一个信号量,然后再创建一个线程。在线程例程的末尾,释放信号量,而不是由主线程完成。在
修改如下:
相关问题 更多 >
编程相关推荐