0

次のコードでコメントを外すlog_itと、threading.active_count11に達します。これは、各ロガーが作成することを意味するためです_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)
4

1 に答える 1

1

これにパスを変更した場合:

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

threading.active_count()常に 1 を出力します。その理由は、実際のスレッドではなく、「グリーンレット」に関する情報を提供するスレッド モジュールにパッチを適用することにあります。

于 2012-08-23T10:35:15.987 に答える