当前位置: 首页 > 面试题库 >

python-如何获取特定类启动的活动线程数?

戚俊健
2023-03-14
问题内容

代码如下所示:

class workers1(Thread):
...   def __init__(self):
...      Thread.__init__(self)
...   def run(self):
...      ...do some stuff

class workers2(Thread):
...   def __init__(self):
...      Thread.__init__(self)
...   def run(self):
...      ...do some stuff


if __name__ == "__main__":
...   start workers 
while True: 
    print "Number of threads active", threading.activeCount()
    print "Number of worker1 threads", ?????, "Number of worker2 threads", ?????

有没有一种方法可以通过发起类来获取活动线程的数量?


问题答案:

这是对Doug
Hellman的多处理ActivePool示例代码(使用线程)的较小修改。这个想法是让您的工作人员在一个池中注册自己,使用线程锁来协调他们对活动目录的修改:

import threading
import time
import random

class ActivePool(object):
    def __init__(self):
        super(ActivePool, self).__init__()
        self.active=[]
        self.lock=threading.Lock()
    def makeActive(self, name):
        with self.lock:
            self.active.append(name)
    def makeInactive(self, name):
        with self.lock:
            self.active.remove(name)
    def numActive(self):
        with self.lock:
            return len(self.active)
    def __str__(self):
        with self.lock:
            return str(self.active)
def worker(pool):
    name=threading.current_thread().name
    pool.makeActive(name)
    print 'Now running: %s' % str(pool)
    time.sleep(random.randint(1,3))
    pool.makeInactive(name)

if __name__=='__main__':
    poolA=ActivePool()
    poolB=ActivePool()    
    jobs=[]
    for i in range(5):
        jobs.append(
            threading.Thread(target=worker, name='A{0}'.format(i),
                             args=(poolA,)))
        jobs.append(
            threading.Thread(target=worker, name='B{0}'.format(i),
                             args=(poolB,)))
    for j in jobs:
        j.daemon=True
        j.start()
    while threading.activeCount()>1:
        for j in jobs:
            j.join(1)
            print 'A-threads active: {0}, B-threads active: {1}'.format(
                poolA.numActive(),poolB.numActive())

产量

Now running: ['A0']
Now running: ['B0']
Now running: ['A0', 'A1']
Now running: ['B0', 'B1']
 Now running: ['A0', 'A1', 'A2']
 Now running: ['B0', 'B1', 'B2']
Now running: ['A0', 'A1', 'A2', 'A3']
Now running: ['B0', 'B1', 'B2', 'B3']
Now running: ['A0', 'A1', 'A2', 'A3', 'A4']
Now running: ['B0', 'B1', 'B2', 'B3', 'B4']
A-threads active: 4, B-threads active: 5
A-threads active: 2, B-threads active: 5
A-threads active: 0, B-threads active: 3
A-threads active: 0, B-threads active: 3
A-threads active: 0, B-threads active: 3
A-threads active: 0, B-threads active: 3
A-threads active: 0, B-threads active: 3
A-threads active: 0, B-threads active: 0
A-threads active: 0, B-threads active: 0
A-threads active: 0, B-threads active: 0


 类似资料:
  • 问题内容: 我有以下代码片段: 在这里,如何在不创建线程类实例的情况下为线程调用方法? 问题答案: 您已经在创建Thread类的实例-您对此不做任何事情。您甚至 可以不使用局部变量 来 调用: …但是我个人通常会将其分配给局部变量,然后执行您想要执行的其他任何操作(例如,设置名称等),然后启动它:

  • 我想这是一个标准的知识问题,但是是否会以线程形式运行? 我想要的是与生产者/消费者的并发会话,这些会话编写/监听他们的特定队列。我已经尝试通过将连接传递给线程来编写一个自定义线程,但是当我创建生产者时,我遇到了一个错误,“我不能在未注册的会话上启动生产者”。

  • 当通过Android Studio运行配置键入启动动态特性模块中的时,我得到以下警告:中声明。(因为它是在动态特性模块的中声明的)。供参考,这是正在使用的库: 运行配置显示并部署了这两个模块,但它只识别来自基础模块的活动。如何在动态特性模块中启动活动? 边注:尝试安装已部署的功能模块时,似乎不会安装: 其中表示(可能是因为它是调试构建);尽管如此,应该找到部署的功能模块...但它没有找到。似乎是这

  • 问题内容: 在我的控制器中,当我需要活动(登录)用户时,我正在执行以下操作以获取UserDetails实现: 它工作正常,但我认为Spring在这种情况下可以使生活更轻松。有没有办法将自动接线连接到控制器或方法中? 例如,类似: 但是我得到了,而不是得到了? 我正在寻找一种优雅的解决方案。有任何想法吗? 问题答案: 序言:从Spring-Security 3.2开始,此答案的末尾描述了一个不错的注

  • 问题内容: 我试图编写一个文件监视器,它将检查文件是否添加了新行,该监视器实际上是一个线程,它将始终由randomaccessfile读取该行。 这是监视器的核心代码: 这是一些帮助类: 这是调用监视器的示例: 现在,我的问题是,如果我仅调用以下代码,代码就可以很好地工作: 这将监视文件的行追加,并通知侦听器。 但是,当我致电: 这意味着我想监视另一个文件而不是之前。 因此,在Monitor中,我