1

スレッドにアクセスした回数をカウントする次のコードがあります。コードは正常に動作していますが、グローバル変数を使用せずに実装できるかどうかを知りたいです。

import threading
import lib.logging
import time

count = 0

class Monitor(threading.Thread):
    def __init__(self, count):
        threading.Thread.__init__(self)

    def run(self):
        global count
        count+=1
        lib.logging.debug ("Count is: " + str(count))

def main():        
    for i in xrange(3): 
        t1 = Monitor(count)
        t2 = Monitor(count)   
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        time.sleep(3)

    print "done"

どうもありがとう

4

2 に答える 2

1

グローバル変数を使用せずに関数呼び出しをカウントしitertools.count、Python の関数のデフォルト引数の動作をカウントすることは可能です。

import threading
import lib.logging
import time
from itertools import count


class Monitor(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self, count=count()):
        # next(count) starts from 0, so to log first '1', + 1 is used
        lib.logging.debug ("Count is: " + str(next(count) + 1))

def main():        
    for i in xrange(3): 
        t1 = Monitor()
        t2 = Monitor()   
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        time.sleep(3)

    print "done"

Python の関数のデフォルト引数に関する投稿は次のとおりです: http://www.lexev.org/en/2013/python-mutable-default-arguments/

于 2013-07-10T15:32:09.027 に答える
1

考えられる解決策の 1 つは、"半永続的な" メモリ内カウンターを使用することです。

例えば

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import threading
import time
import redis


class RedisCounter(object):

    def __init__(self, db, host, port, key, reset=False):
        pool = redis.ConnectionPool(host=host, port=port, db=db)
        self.conn = redis.StrictRedis(connection_pool=pool)
        self.key = key

        if reset:
            self.initialize()

    def initialize(self):
        self.conn.set(self.key, 0)

    def incr(self):
        self.conn.incr(self.key)

    def get(self):
        return int(self.conn.get(self.key))


class Monitor(threading.Thread):

    def __init__(self, counter):
        threading.Thread.__init__(self)
        self.counter = counter

    def run(self):
        self.counter.incr()
        print("Count is: " + str(self.counter.get()))


def main():
    counter = RedisCounter(0, 'localhost', 6379, 'thread_counter', True)

    for i in xrange(3):
        t1 = Monitor(counter)
        t2 = Monitor(counter)
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        time.sleep(3)

    print "done"

if __name__ == '__main__':
    main()

これはあなたにとってやり過ぎかもしれませんが、それでもそのような問題を解決する方向性です:)

于 2013-07-10T15:29:21.657 に答える