2012-08-23 21 views
0

logger.info用下面的代码,如果我取消log_it线程数的增加,threading.active_count达到11 ,因为这意味着每个记录创建_DummyThread daemons.Now
与运行在greenlet

Q1.Is他们的任何方式来达到同样的不创建额外的线程?

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

如果更改pathcing这样:

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

threading.active_count()将打印所有的时间。原因在于修补线程模块 ,它为您提供有关“greenlet”的信息,而不是关于真正的线程。