Хорошо, вы хотите, чтобы вывод убил всю точку multi-threading
.
Почему?
У потока есть начало,последовательность выполнения и вывод.У него есть указатель инструкции, который отслеживает, где в его контексте он запущен.
Продолжая с этого момента, ваш вопрос будет запускать несколько потоков одновременно, независимо от того, какой function
выполняется первым.
То, что вы пытаетесь сделать так:
Последовательный запуск потоков, независимо от того, какой поток завершается первым, то есть это не multi-threading
.Кроме того, использование lock.acquire() and lock.release()
внутри каждой функции для лишает душу многопоточности
Ответ: если вы действительно хотите, чтобы потоки запускались последовательно, вам не следуетполучение и освобождение потоков внутри функций,
Небольшое изменение:
from termcolor import colored
import threading
import time
from random import randrange
def threadRed(n, tempo):
for i in range(n):
# lock.acquire()
print(colored("red", 'grey', 'on_red', attrs=['dark', 'bold']))
print(colored("I'm going to sleep for %d seconds," % tempo, 'red'))
time.sleep(tempo)
# lock.release()
def threadYellow(n, tempo):
for i in range(n):
# lock.acquire()
print(colored("yellow", 'grey', 'on_yellow', attrs=['dark', 'bold']))
print(colored("I'm going to sleep for %d seconds," % tempo, 'yellow'))
time.sleep(tempo)
# lock.release()
def threadGreen(n, tempo):
for i in range(n):
# lock.acquire()
print(colored("green", 'grey', 'on_green', attrs=['dark', 'bold']))
print(colored("I'm going to sleep for %d seconds," % tempo, 'green'))
time.sleep(tempo)
# lock.release()
lock = threading.Lock()
repeticoes = 5
lock.acquire()
tempo = randrange(1, 11)
t_red = threading.Thread(target=threadRed, args=(repeticoes, tempo))
tempo = randrange(1, 11)
t_yellow = threading.Thread(target=threadYellow, args=(repeticoes, tempo))
tempo = randrange(1, 11)
t_green = threading.Thread(target=threadGreen, args=(repeticoes, tempo))
lock.release()
t_red.start()
t_yellow.start()
t_green.start()
t_red.join()
t_yellow.join()
t_green.join()
ВЫХОД:
red
I'm going to sleep for 6 seconds,
yellow
I'm going to sleep for 4 seconds,
green
I'm going to sleep for 4 seconds,
yellow
I'm going to sleep for 4 seconds,
green
I'm going to sleep for 4 seconds,
red
I'm going to sleep for 6 seconds,
yellow
I'm going to sleep for 4 seconds,
green
I'm going to sleep for 4 seconds,
red
I'm going to sleep for 6 seconds,