Python:线程具体次数
Python: Threading specific number of times
我有以下使用 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个线程。我怎样才能让它继续 运行 线程直到它达到某个 #。即 运行 在 5 个线程,直到 worker()
有 运行 100 次。
只是做一个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)
当然是循环播放。
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.Lock
对 count
的受保护访问;依靠 GIL 是粗略的。
说实话,如果你想要这样的东西,那说明你走错了方向。因为这段代码是stateful
和stateful
处理,离真正的并行执行还很远。
另外通常如果你想在python中并行执行代码,你需要使用multiprocessing模块。
所以,基本上,如果您的目标是总共 tick 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
我有以下使用 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个线程。我怎样才能让它继续 运行 线程直到它达到某个 #。即 运行 在 5 个线程,直到 worker()
有 运行 100 次。
只是做一个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)
当然是循环播放。
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.Lock
对 count
的受保护访问;依靠 GIL 是粗略的。
说实话,如果你想要这样的东西,那说明你走错了方向。因为这段代码是stateful
和stateful
处理,离真正的并行执行还很远。
另外通常如果你想在python中并行执行代码,你需要使用multiprocessing模块。
所以,基本上,如果您的目标是总共 tick 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