2016-06-29 21 views
0

Ich versuche, einen Zähler zu erstellen, um "Host 5/100 fertig" am Ende meiner Aufgabe anzuzeigen. Ich habe einen Zähler classe:Fabric-Zähler zum Anzeigen, wie viele Hosts fertig sind

class ThreadCounter(object): 
    def __init__(self, initval=0): 
     self.val =int(initval) 
     self.lock = threading.Lock() 

    def increment(self): 
     with self.lock: 
     self.val += 1 
    def value(self): 
     with self.lock: 
     return self.val 

ich ein paar Dinge ausprobiert, es funktioniert: In meiner Hauptfunktion, ich meine Aufgabe rufen Sie den Zähler als Argument geben

def main(): 
    my_counter = ThreadCounter(0) 
    execute(the_task,my_counter) 
@parallel 
def the_task(counter): 
    try: 
    do---my--stuff 
    finally : 
    my_counter.increment() 
    print my_counter.value() 

Der Zähler war immer an "1" wenn angezeigt. Ich fühle mich wie der Zähler nicht geteilt wurde.

Ich habe auch versucht, den Zähler als global aber das gleiche Ergebnis zu deklarieren. Mein letzter Versuch war ein lock-the_task und in the_task geben:

with lock : 
    counter += 1 
    print counter 

Was soll ich tun Zähler zwischen den gleichen Stoff Aufgaben zu teilen? Ich bin neu mit Threads in Python. (Ich verwende Python 2.6 (nicht freiwillig))

Antwort

1

Sie einen Dekorateur verwenden können wie die Erledigung der Aufgabe zu verfolgen,

total = 100 
count = 0 

def counter(f): 
    def wrapped(*args, **kwargs): 
     globals()["count"] += 1 
     ret = f(*args, **kwargs) 
     print "host %(count)s/%(total)s done" % globals() 
     return ret 
    return wrapped 

@counter 
def first_task(counter): 
    # do---my--stuff 
    pass 

@counter 
def second_task(counter): 
    # do---my--stuff 
    pass 
+0

Ow, ich habe vergessen, laufen meine Aufgabe parallel zu sagen. Das macht genau das, was ich wollte, und ich denke, es zwingt meine Aufgabe, sequentiell zu sein. – pwnsauce