Python:特定次数的线程

时间:2016-09-19 19:28:47

标签: python multithreading python-multithreading

我有以下使用threading的代码并打印当前计数。

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个线程。

3 个答案:

答案 0 :(得分:2)

只需做一个循环,但用锁定保护您的计数器和测试,否则测试的值将与您刚刚增加的值不同。

我添加了线程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)

答案 1 :(得分: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是粗略的。

答案 2 :(得分:1)

老实说,如果你想要这样的东西,那就意味着你会走向错误的方向。因为此代码是stateful并且stateful处理远离实际并行执行。 通常,如果你想在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