当另一个函数在python上停止时如何停止一个函数

时间:2019-11-24 20:33:57

标签: python multithreading python-multithreading

我有一个工作功能会在用户写出口时停止,但是我还有另一个功能不会停止,因此cmd会一直保持打开状态,不会像其他功能会不断更改cmd那样关闭文字颜色

import os,webbrowser,time,random,sys
from threading import Thread 

def fun1():
    Q=1
    while Q==1:
        print ('would you like to:')
        print('1.launch an applcation')
        print('2.browse the internet')
        print('========================================')
        bruv=input('your answer: ')
        if bruv in ('1','launch','launch app','launch an application'):
            print('========================================')
            print('what app would you like to open?')
            print('========================================')
            x=input('your answer: ')
            if x not in ('word'):
                y=x+'.exe'
                os.startfile(y)
            else:
                z='win'+x
                os.startfile(z)
        if bruv in ('2','browse the internet','browse','browse internet'):
            print('========================================')
            print ('where would you like to go?')
            print('========================================')
            p=input('your answer: ')
            p='www.'+p+'.com'
            webbrowser.open(p)
            print('========================================')
            print ('ok')
        print('========================================')
        print ('wanna continue?')
        if input() in ('exit','no','quit','nope','close'):
            print('========================================')
            print ('ok! thanks for using my bot!')
            print('========================================')
            time.sleep(1)
            Q+=1
            countdown=3
            while countdown>=0:
                if countdown!=0:
                    print (countdown)
                    time.sleep(1)
                    countdown-=1
                else:
                    sys.exit()

def fun2():
    what=1
    while what==1:
        os.system('color E')
        time.sleep(0.2)
        os.system('color A')
        time.sleep(0.2)
        os.system('color C')
        time.sleep(0.2)
        os.system('color B')
        time.sleep(0.2)
        os.system('color D')
        time.sleep(0.2)
    else:
        sys.exit()

t1=Thread(target=fun1)
t2=Thread(target=fun2)

t1.start()
t2.start()

在此代码中fun2不断滚动更改颜色并不会关闭CMD 我也知道这段代码非常糟糕,我只是在启动python。

1 个答案:

答案 0 :(得分:0)

所以这里的问题是,整个脚本(同时启动两个函数/线程)在默认情况下仅在其启动的所有线程都停止时才结束。因此,您的所有函数都需要在某个时候返回,但是您的fun2()将永远不会结束,因为无限循环while what==1将始终以what等于1的方式运行。 (请注意,Python中无穷循环的约定是使用while True: ...)。

要告诉一个线程所有其他线程都应该完成时,必须将其设置为Daemon。您可能需要查看here,其中文档显示:

  

可以将一个线程标记为“守护程序线程”。的意义   标志是只有守护程序线程时,整个Python程序都会退出   离开了。初始值是从创建线程继承的。的   可以通过daemon属性或daemon构造函数设置标志   论点。

因此,在上面的示例中,使t2成为守护进程应该可以工作。

... 
t1 = Thread(target=fun1)
t2 = Thread(target=fun2)
t2.deamon = True

t1.start()
t2.start()

P.S .:另外请注意,color并非在所有终端和操作系统(例如MacOS)上都适用