2016-11-29 11 views
1

rgb ledストリップを制御するために同様のコードを使用しています。ランダムな値が数秒ごとに表示され、3つのスレッドが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() 

以上が細かい実行されますが応答は、代わりに、スレッドの終了時にすべての3つの色を得るための、私は時々、予想以上取得し、時代の最も少なくとも一方が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 
+0

あなたの仮定は正しいです。あなたがおそらくそれを間違っていることを知っているスレッドコードで 'グローバル'を見るたびに。 –

+2

実際にここでスレッドを使用している理由はありますか? 3つのLEDを順番に更新するのではなく、アップデートにほとんど時間がかからないのはなぜですか? – chthonicdaemon

+0

私がスレッドを使用する理由は、変更の間のスムーズな移行を達成しようとしているため、3色の移行を同時に実行するために 'for i in range..'を使用することです。 –

答えて

1

あなたはGIL(グローバルインタープリタロック)を考えましたか? https://wiki.python.org/moin/GlobalInterpreterLock

Pythonには、複数のスレッドを1つのプロセスから実行できないGILがあります。コードを実行すると、Pythonプロセスとして実行されます。あなたは、pythonで許可されていない同じプロセスからスレッドを起動しようとしています。

いくつかの操作を並行して実行する場合は、マルチプロセッシングパッケージが適しています。アカウントに他の要因を考慮せず
https://pymotw.com/2/multiprocessing/basics.html

+0

ありがとう@Tejas! 産卵プロセスが問題を解決しましたが、私はもはや 'global'を使うことができませんでしたが、各プロセスの始めにLEDの値を読み取って取り組んだ。 –

+1

@StratosIonなぜマルチスレッド化がうまくいきませんか?スレッド間でメモリを共有していないため、問題が発生しました。 –

1

(下記参照)for i in range(start,end):ループは2.5秒まで続きます。実際には2秒ごとに新しいスレッドを生成します。

また、そのループの実際の期間は、実際にはさらに長い:

あなたは睡眠を頼むたび
  • 、期間は少なくとも、あなたが求めているものです。それはわずかに多いかもしれません。特に100分の1秒を求めるときは、もうちょっと長いかもしれません。
  • あなたは多くの小さな睡眠を次々に求めているので、その効果が倍増することが期待されるかもしれません。

    • 単一のウェイトを使用します:time.sleep(0.01 * start-end if end>start else 0)
    • を3-新しいスレッドを生成するために使用される時間を増やしてループfor i in range(start,end):で過ごした合計時間は

    をしようとする予想よりも長くなることを意味4秒

関連する問題