2016-06-29 4 views
0

작업이 끝날 때 "호스트 5/100 완료"를 표시 할 수 있도록 카운터를 만들려고합니다. 나는 카운터가 항상 있었다얼마나 많은 호스트가 수행되었는지를 나타내는 패브릭 카운터

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() 

인수로 카운터를주고 내 작업 전화 을 내 주요 기능에 :

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 

내가 그것을 작동하게하는 몇 가지 시도 : 나는 카운터 CLASSE이 표시되면 "1". 나는 카운터가 공유되지 않았던 것처럼 느낀다.

또한 카운터를 global으로 선언했지만 동일한 결과를 나타 냈습니다. 내 마지막 시도가 lockthe_task에와 the_task에주고 있었다 :

with lock : 
    counter += 1 
    print counter 

내가 같은 직물 작업 사이에 카운터를 공유해야합니까? 저는 파이썬에서 쓰레드를 처음 접했습니다. 당신이 좋아하는 작업 완료를 추적하기 위해 장식을 사용할 수 있습니다

답변

1

,

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

아야 (I 파이썬 2.6 (안 기꺼이)를 ​​사용), I는 말을 병렬로 내 작업 실행을 잊어 버렸습니다. 이것은 내가 원했던 것과 정확히 똑같이 수행한다. 내 작업이 순차적으로 진행될 것이라고 생각한다. – pwnsauce