为什么在Python中,线程数量会超过设置的threading.BoundedSemaphore?

2024-09-27 21:30:03 发布

您现在位置:Python中文网/ 问答频道 /正文

代码如下:

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()处挂断?谢谢!在


Tags: 代码testimportselfgonumberfortime
2条回答

没有理由相信信号灯坏了。不清楚的是为什么你不这么认为,你的主循环不会等待任何东西——它会以最快的速度触发线程,在两次尝试之间休眠四分之一秒。在每次迭代中,它都会释放sempahore。所以:

acquire sempahore
create a thread
sleep 0.25 seconds
release sempahore

acquire semaphore
create a thread
sleep 0.25 seconds
release sempahore

等等等等。事实上,信号量计数永远不会低于9!每次你获得它,你在试图再次获得它之前就释放了它。在

对不起,我猜不出你打算做什么。在

正如@Tim Peters所说,在你的主线程中,你获取一个信号量,创建一个线程,释放这个信号量,然后重复这个过程200次,这不会将信号量的数量减少到0。在

如果你想控制创建的线程数,在主线程中,你应该先获取一个信号量,然后再创建一个线程。在线程例程的末尾,释放信号量,而不是由主线程完成。在

修改如下:

#!/usr/bin/env python2.7
#coding: utf-8

import threading
import time


class Test:
    #set the max thread number
    threadLimiter = threading.BoundedSemaphore(10)

    def go(self):
        lstRecordThreads = []
        for i in range(1, 200):
            Test.threadLimiter.acquire()
            recordThread = threading.Thread(target=self.recordExec, args=(i,))
            recordThread.start()
            lstRecordThreads.append(recordThread)

        for rt in lstRecordThreads:
            rt.join()

    def recordExec(self, number):
        print "current number=["+str(number)+"]"
        time.sleep(1)
        print "done=["+str(number)+"]"
        print('Active thread count: %d' % (threading.active_count(),))        
        Test.threadLimiter.release()


if __name__ == '__main__':
    t = Test()
    t.go()

相关问题 更多 >

    热门问题