2016-09-19 47 views
3

我有以下代碼,它使用threading並打印當前計數。Python:執行特定次數

import threading 

count = 0 
def worker(): 
    """thread worker function""" 
    global count 
    count += 1 
    print(count) 

threads = [] 
for i in range(5): 
    t = threading.Thread(target=worker) 
    threads.append(t) 
    t.start() 

它目前設置爲5個主題。我如何讓它繼續運行線程,直到它達到某個#。即以5個線程運行,直到worker()運行100次。

回答

2

只是做一個while循環,但保護你的計數器和你的測試用鎖,否則測試的值將會與你剛剛增加的值不同。

我已經添加了線程ID,以便我們看到哪個線程實際上增加了計數器。

另外:先檢查,增加後。

最後等待線程。

import threading 

lck = threading.Lock() 

count = 0 
def worker(): 
    global count 
    """thread worker function""" 
    while True: 
     lck.acquire() 
     if count==100: 
      lck.release() 
      break 
     count += 1 
     print(threading.current_thread() ,count) 
     lck.release() 

threads = [] 
for i in range(5): 
    t = threading.Thread(target=worker) 
    threads.append(t) 
    t.start() 

for t in threads: 
    t.join() 

結果:

(<Thread(Thread-1, started 5868)>, 1) 
(<Thread(Thread-2, started 7152)>, 2) 
(<Thread(Thread-3, started 6348)>, 3) 
(<Thread(Thread-4, started 6056)>, 4) 
(<Thread(Thread-1, started 5868)>, 5) 
(<Thread(Thread-5, started 5748)>, 6) 
(<Thread(Thread-2, started 7152)>, 7) 
(<Thread(Thread-3, started 6348)>, 8) 
(<Thread(Thread-4, started 6056)>, 9) 
(<Thread(Thread-1, started 5868)>, 10) 
(<Thread(Thread-5, started 5748)>, 11) 
(<Thread(Thread-2, started 7152)>, 12) 
(<Thread(Thread-3, started 6348)>, 13) 
(<Thread(Thread-4, started 6056)>, 14) 
(<Thread(Thread-1, started 5868)>, 15) 
(<Thread(Thread-5, started 5748)>, 16) 
(<Thread(Thread-2, started 7152)>, 17) 
(<Thread(Thread-3, started 6348)>, 18) 
(<Thread(Thread-4, started 6056)>, 19) 
(<Thread(Thread-1, started 5868)>, 20) 
(<Thread(Thread-5, started 5748)>, 21) 
(<Thread(Thread-2, started 7152)>, 22) 
(<Thread(Thread-3, started 6348)>, 23) 
(<Thread(Thread-4, started 6056)>, 24) 
(<Thread(Thread-1, started 5868)>, 25) 
(<Thread(Thread-5, started 5748)>, 26) 
(<Thread(Thread-2, started 7152)>, 27) 
(<Thread(Thread-3, started 6348)>, 28) 
(<Thread(Thread-4, started 6056)>, 29) 
(<Thread(Thread-1, started 5868)>, 30) 
(<Thread(Thread-5, started 5748)>, 31) 
(<Thread(Thread-2, started 7152)>, 32) 
(<Thread(Thread-3, started 6348)>, 33) 
(<Thread(Thread-4, started 6056)>, 34) 
(<Thread(Thread-1, started 5868)>, 35) 
(<Thread(Thread-5, started 5748)>, 36) 
(<Thread(Thread-2, started 7152)>, 37) 
(<Thread(Thread-3, started 6348)>, 38) 
(<Thread(Thread-4, started 6056)>, 39) 
(<Thread(Thread-1, started 5868)>, 40) 
(<Thread(Thread-5, started 5748)>, 41) 
(<Thread(Thread-2, started 7152)>, 42) 
(<Thread(Thread-3, started 6348)>, 43) 
(<Thread(Thread-4, started 6056)>, 44) 
(<Thread(Thread-1, started 5868)>, 45) 
(<Thread(Thread-5, started 5748)>, 46) 
(<Thread(Thread-2, started 7152)>, 47) 
(<Thread(Thread-3, started 6348)>, 48) 
(<Thread(Thread-4, started 6056)>, 49) 
(<Thread(Thread-1, started 5868)>, 50) 
(<Thread(Thread-5, started 5748)>, 51) 
(<Thread(Thread-2, started 7152)>, 52) 
(<Thread(Thread-3, started 6348)>, 53) 
(<Thread(Thread-4, started 6056)>, 54) 
(<Thread(Thread-1, started 5868)>, 55) 
(<Thread(Thread-5, started 5748)>, 56) 
(<Thread(Thread-2, started 7152)>, 57) 
(<Thread(Thread-3, started 6348)>, 58) 
(<Thread(Thread-4, started 6056)>, 59) 
(<Thread(Thread-1, started 5868)>, 60) 
(<Thread(Thread-5, started 5748)>, 61) 
(<Thread(Thread-2, started 7152)>, 62) 
(<Thread(Thread-3, started 6348)>, 63) 
(<Thread(Thread-4, started 6056)>, 64) 
(<Thread(Thread-1, started 5868)>, 65) 
(<Thread(Thread-5, started 5748)>, 66) 
(<Thread(Thread-2, started 7152)>, 67) 
(<Thread(Thread-3, started 6348)>, 68) 
(<Thread(Thread-4, started 6056)>, 69) 
(<Thread(Thread-1, started 5868)>, 70) 
(<Thread(Thread-5, started 5748)>, 71) 
(<Thread(Thread-2, started 7152)>, 72) 
(<Thread(Thread-3, started 6348)>, 73) 
(<Thread(Thread-4, started 6056)>, 74) 
(<Thread(Thread-1, started 5868)>, 75) 
(<Thread(Thread-5, started 5748)>, 76) 
(<Thread(Thread-2, started 7152)>, 77) 
(<Thread(Thread-3, started 6348)>, 78) 
(<Thread(Thread-4, started 6056)>, 79) 
(<Thread(Thread-1, started 5868)>, 80) 
(<Thread(Thread-5, started 5748)>, 81) 
(<Thread(Thread-2, started 7152)>, 82) 
(<Thread(Thread-3, started 6348)>, 83) 
(<Thread(Thread-4, started 6056)>, 84) 
(<Thread(Thread-1, started 5868)>, 85) 
(<Thread(Thread-5, started 5748)>, 86) 
(<Thread(Thread-2, started 7152)>, 87) 
(<Thread(Thread-3, started 6348)>, 88) 
(<Thread(Thread-4, started 6056)>, 89) 
(<Thread(Thread-1, started 5868)>, 90) 
(<Thread(Thread-5, started 5748)>, 91) 
(<Thread(Thread-2, started 7152)>, 92) 
(<Thread(Thread-3, started 6348)>, 93) 
(<Thread(Thread-4, started 6056)>, 94) 
(<Thread(Thread-1, started 5868)>, 95) 
(<Thread(Thread-5, started 5748)>, 96) 
(<Thread(Thread-2, started 7152)>, 97) 
(<Thread(Thread-3, started 6348)>, 98) 
(<Thread(Thread-4, started 6056)>, 99) 
(<Thread(Thread-1, started 5868)>, 100) 
2

循環它,當然。

lock = threading.Lock() 
count = 0 
def worker(): 
    """thread worker function""" 
    global count 
    while True: 
     with lock: 
      if count >= 100: break 
      count += 1 
      print(count) 

注意保護訪問countthreading.Lock;依靠GIL粗略。

1

說實話,如果你想要這樣的事情,這意味着你會走向錯誤的方向。因爲這個代碼是statefulstateful處理是遠離真正的並行執行。 另外通常如果你想在python中並行執行代碼,你需要使用multiprocessing模塊。

所以,基本上,如果你的目標是蜱共100次,這是更好地重寫代碼無國籍方式:

import multiprocessing as mp 

def worker_1(x): 
    for i in range(x) 
     print i 

def worker_2(y): 
    print y 

if __name__ == '__main__': 
    p = mp.Pool(5) 

    for x in p.pool(worker_1, [25, 25, 25, 25]): 
    // process result 
    pass 

    for y in p.pool(worker_2, range(100)): 
    // process result 
    pass