Многопоточная программа, не возвращающаяся к основному потоку немедленно

#python #windows #multithreading

#python #Windows #многопоточность

Вопрос:

Проблема

У меня есть программа, которую я написал, которая использует два потока. Один поток изменяет цвет текста и фона командной строки. Другой поток отображает меню справки или перебирает список из 1000 чисел. Проблема в том, что я хочу, чтобы программа возвращалась к приглашению и ждала новых инструкций вместо циклического перехода по цветовому спектру. Я бы хотел, чтобы программа перебирала цветовой спектр, а также ждала, пока конечный пользователь введет что-то еще в командной строке. Разве это невозможно? К сожалению, эта программа будет работать только в операционной системе Windows (OS).

Кроме того, я даже не могу вывести-C из программы, если захочу, потому что поток, который я создаю, по-видимому, не будет прослушивать ввод. Странно.

Код

 import os
import getopt
import time
import sys
import threading


def whiteRabbit():
    """Change the color of the command prompt while the program is executing."""

    for i in range(60):
        os.system('color %d' % i)
        time.sleep(1)

def goGoGo():
    for i in range(1000):
        print("Hey we have another number, %d " % i)

def howTo():
    print("Here are the options for this program")
    print ("%s -h (help menu. What you are reading now.)" % sys.argv[0])
    print("%s -g (goGoGo() mode. This prints a list of numbers to the console. Wow. :0" % sys.argv[0])
    print("%s --whiteRabbit (This changes the color of the console. Windows only. Sorry cool Unix people." % sys.argv[0])



if __name__ == "__main__":

    try:
        opts, args = getopt.gnu_getopt(sys.argv[1:], 'hg', ['whiteRabbit'])

        for opt, arg in opts:

            if opt in ('-h'):
                howTo()
            elif opt in ('-g'):
                goGoGo()
            elif opt in ('--whiteRabbit'):
                wr = threading.Thread(target=whiteRabbit)
                wr.start()

    except getopt.GetoptError as crap:
        howTo()
  

Комментарии:

1. Какие параметры вы используете для запуска программы?

2. -h —WhiteRabbit или -g —WhiteRabbit . Любой из этих вариантов.

3.Я думаю, вам нужно сделать поток демоном: т. е.: wr.daemon - True перед вызовом wr.start() .

4. Если я это сделаю, wr.daemon = True , то консоль вообще не меняет цвета. Странно. Это небольшое изменение кода заставляет программу вести себя как обычно без каких-либо изменений цвета.