代码之家  ›  专栏  ›  技术社区  ›  r0h1t4sh

线程数随着运行greenlet中的logger.info而增加

  •  0
  • r0h1t4sh  · 技术社区  · 12 年前

    如果我取消注释,则使用以下代码 log_it , threading.active_count 达到11。 因为这意味着每个记录器都会创建 _DummyThread daemons.Now

    Q1.他们有没有办法在不创建额外线程的情况下实现同样的目的?

    Q2.为什么记录器需要创建另一个线程。为什么它不能以相同的方式执行,比如 fun 作用

    from gevent import monkey
    monkey.patch_all()
    
    import threading
    import gc
    import gevent
    import logging
    
    def print_stats():
        while True:
            gc.collect()
            print threading.active_count() 
            gevent.sleep(2)
    
    jobs = [gevent.spawn(print_stats)]
    logger = logging.getLogger(__name__)
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    logger.setLevel(logging.INFO)
    form = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    ch.setFormatter(form)
    logger.addHandler(ch)
    
    def log_it():
        string = 'abcdefghijklmnopqrstuvwxyz'
        logger.info(string)
    
    def fun():
        print "hello world"
    
    def block_for_some_time():
        log_it()
        fun()
        gevent.sleep(5)
        print 'exiting thread'
    
    for i in range(10):
        jobs.append(gevent.spawn(block_for_some_time))
    
    gevent.joinall(jobs)
    
    1 回复  |  直到 12 年前
        1
  •  1
  •   Oleksii Kachaiev    12 年前

    如果将路径更改为:

    from gevent import monkey
    monkey.patch_all(thread=False)
    

    threading.active_count() 将始终打印1。原因是在修补线程模块中, 它为您提供了关于“greenlets”的信息,而不是关于真实线程的信息。