我有以下代码,它计算我访问线程的次数。代码工作正常,但我想知道是否可以在不涉及任何全局变量的情况下实现。
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"
非常感谢
答案 0 :(得分: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()
这对你来说可能是一种矫枉过正,但仍然是解决这个问题的方向:)
答案 1 :(得分: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/