簡體   English   中英

使用 python 多線程運行無限循環

[英]Running infinite loops using python multi threading

所以我有一個類似的問題: Running infinite loops using threads in python

我想創建多個線程(最多 50 個)同時運行相同的代碼,並具有無限的 while 循環。 這些線程之間沒有交互。 這背后的實際想法是我有一串 WS2811 LED,我想用不同的顏色模式(如閃爍)獨立控制它們。

我對類似問題的問題是,如果它們都在做同樣的事情,我不想為每個線程創建 50 個類。 我想創建這些線程,基於一個常見的 class,帶有一個 for 循環。 我遇到的問題是這個無限循環中只有一個線程,而另一個甚至沒有啟動。 我該如何解決?

import threading
import time


class LEDManager(threading.Thread):
    def __init__(self, id_manager):
        threading.Thread.__init__(self)
        self.id_manager = int(id_manager)

    def initiate(id_manager):
        while True:
            print("Thread " + str(id_manager) + " blink on")
            time.sleep(2)
            print("Thread " + str(id_manager) + " blink off")
            time.sleep(2)


def main():
    thread_id = ("0", "1")
    led_index = 0
    thread_list = list()
    for objs in thread_id:
        thread = threading.Thread(target=LEDManager.initiate(led_index), args=(led_index,))
        thread_list.append(thread)
        time.sleep(1)
        led_index += 1
    for thread in thread_list:
        thread.start()


if __name__ == "__main__":
    main()

上面代碼中的 output 是:

Thread 0 blink on
Thread 0 blink off
Thread 0 blink on
Thread 0 blink off
.
.
.

這是一種重構代碼以使其工作的方法

import threading
import time


class LEDManager(object):
    def __init__(self):
        pass

    def initiate(self, idx):
        while True:
            print("Thread " + str(idx) + " blink on")
            time.sleep(2)
            print("Thread " + str(idx) + " blink off")
            time.sleep(2)


def main():
    thread_list = list()
    l = LEDManager()
    for i in range(50):
        thread = threading.Thread(target=l.initiate, args=(i,))
        thread_list.append(thread)

    for thread in thread_list:
        thread.start()

當然它可以用更多的最佳實踐方式來寫,我的建議是看看greenlet

請記住, GIL不會為您提供真正的線程行為(真正的並行運行),您可以為此查看多處理

由於您從threading.Thread派生LEDManager ,因此它一個線程。 不要創建新的threadingThread對象來運行它的成員函數! 只需創建LEDManagerstart()的實例:

import threading
import time


class LEDManager(threading.Thread):
    def __init__(self, id_manager):
        threading.Thread.__init__(self)
        self.id_manager = int(id_manager)

    def run(self):
        while True:
            print("Thread " + str(self.id_manager) + " blink on")
            time.sleep(2)
            print("Thread " + str(self.id_manager) + " blink off")
            time.sleep(2)


def main():
    thread_id = ("0", "1")
    led_index = 0
    thread_list = list()
    for objs in thread_id:
        thread = LEDManager(led_index)
        thread_list.append(thread)
        led_index += 1
    for thread in thread_list:
        thread.start()
        time.sleep(1)


if __name__ == "__main__":
    main()

(歸功於@stovfl)

threading.Thread.run()方法在線程被start()編輯時自動調用。

我還將一秒鍾的睡眠移到了開始循環,以使線程的 output 交錯,我懷疑這是您的意圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM