从线程调用函数并让原始线程在后台运行

时间:2017-08-13 18:52:43

标签: python multithreading

我从一个线程调用一个函数,一旦函数开始运行,两个线程都会停止工作,直到函数执行完毕,并且在函数执行后程序才会停止。

class listen(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        self.playmusicobject = playmusic()
        self.objectspeak = speak()
        self.apiobject = googleAPI()

    def listening(self):

        self.r = sr.Recognizer()
        threadLock.acquire()
        try:

            with sr.Microphone() as source:
                print("say something")
                self.audio = self.r.listen(source)

        finally:
            threadLock.release()

    def checkingaudio(self):

        threadLock.acquire()
        try:
            # a = str(self.r.recognize_google(self.audio))
            a = str(self.r.recognize_google(self.audio))
            print(a)
            if a in greetings:
                self.objectspeak.speaking("I am good how are you?")

            if a in music:
                print("playing music")
                self.playmusicobject.play()

            if a in stop:
                print("stopping")
                self.playmusicobject.b()

            if a in api:
                self.apiobject.distance()
        finally:
            threadLock.release()

class playmusic:

    def play(self):
        playsound.playsound("playthisfile")

if __name__ == "__main__":
    while 1:
        d = listen()
        t1 = threading.Thread(target=d.listening)
        t1.start()
        t2 = threading.Thread(target=d.checkingaudio)
        t2.start()

每当我在playmusic中调用play函数时,两个线程都会停止,并且在play函数执行后程序停止。无论如何,函数播放或事实上运行函数CheckingAudio的线程调用的任何其他函数都不会停止2个原始线程。我尝试将play函数作为它自己的线程运行但是不成功这样做,它只是给了我一个错误,说无法启动线程t3,方式是作为一个线程调用该函数(这可能是错误的)

        if a in music:
            print("playing music")
            t3 = threading.Thread(target=self.playmusicobject.play)
            t3.start()

我尝试在playmusic类中创建一个runplaythread函数,但仍然给我错误无法启动线程。

1 个答案:

答案 0 :(得分:0)

不确定它是否会解决您的问题,但您的上一个帖子的目标是错误的,您使用select * from data_1d where and open_close>20代替self来调用d的实例。

这是您的代码已更正以替换上下文

listen

注意:评论可能没问题,但代表不够。

编辑:现在明确提到重用OP的代码用于上下文。 (虽然这很明显)

EDIT2:你在哪里调用你的第三个帖子并不清楚,但似乎没有问题,请看评论。