2016-09-19 32 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スレッドに設定されています。それが特定の#に達するまで、どのようにスレッドを実行し続けることができますか? worker()が100回実行されるまで5スレッドで実行されます。

答えて

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) 

threading.Lockcountに保護されたアクセスに注意してください。 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 
関連する問題