Я использую аналогичный код, как показано ниже, для управления полосой во главе с rgb, случайные значения поступают через каждые несколько секунд и создаются 3 потока для управления тремя отдельными цветами.Нити Python не закрываются после присоединения
import time
from ast import literal_eval
import threading
from random import randint
t=[]
myR =0
myG =0
myB =0
temp = 0
pins = [17,22,24]
myColours = [myR,myG,myB]
red_pin = 17
green_pin = 22
blue_pin = 24
def change_led_color(rgb):
global myR
global myG
global myB
y = 0
threads = []
for colour in rgb:
t = threading.Thread(target=leds,name=pins[y] ,args=(y,myColours[y],colour,pins[y]))
threads.append(t)
y += 1
for y in threads:
y.start()
for y in threads:
y.join()
def leds(index,start,end,pin):
temp=0
for i in range(start,end):
time.sleep(0.01)
temp = i
global myColours
print 'pin', pin, 'started at: ',start,' ended is: ', temp
myColours[index] = end
def set_colours():
print '..................................................................',t
print threading.activeCount(),'threads \n'
threading.Timer(2, set_colours).start()
change_led_color(t)
set_colours()
def get_data():
while True:
global t
t = (randint(0,255),randint(0,255),randint(0,255))
time.sleep(2)
threading.Thread(target=get_data).start()
Вышеприведенные работает нормально, но ответы очень странно, вместо того, чтобы получить все три цвета в конце резьбы, иногда я получаю больше, чем ожидалось, и в большинстве случаев, по крайней мере один будет 0, как нить никогда не запускается! Я предполагаю, что я неправильно использую резьбу.
например. результат
.................................................................. (187, 223, 42)
3 threads
pin 24 started at: 205 ended is: 0
pin 22 started at: 170 ended is: 222
pin 17 started at: 107 ended is: 186
.................................................................. (202, 115, 219)
3 threads
pin 22 started at: 223 ended is: 0
pin 17 started at: 187 ended is: 201
.................................................................. (244, 35, 194)
5 threads
pin 22 started at: 115 ended is: 0
pin 24 started at: 42 ended is: 218
pin 17 started at: 202 ended is: 243
pin 24 started at: 42 ended is: 193
.................................................................. (54, 25, 72)
3 threads
pin 17 started at: 244 ended is: 0
pin 22 started at: 35 ended is: 0
pin 24 started at: 194 ended is: 0
Ваше предположение верно. Каждый раз, когда вы видите «глобальный» код потока, вы знаете, что, вероятно, это неправильно. –
Есть ли причина, по которой вы фактически используете темы здесь? Почему бы не просто обновить три светодиода последовательно, учитывая, что обновление почти не займет времени? – chthonicdaemon
Причина, по которой я использую потоки, заключается в том, что я пытаюсь добиться плавного перехода между изменениями, следовательно, использование 'for i in range..' для выполнения перехода трех цветов одновременно. –