作用域规则和线程

2024-10-08 19:19:54 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个有效的程序(我能够在实际操作中听到文本到语音):

import pyttsx
import threading

def saythread(location, text):

    engine = pyttsx.init() 

    engine.say(text)
    engine.runAndWait()


e = (1, "please work, oh my god")
t = threading.Thread(target=saythread,args=e,name='sayitthread')
t.start()

如果程序更改为

^{pr2}$

然后它就被“卡住”了引擎。运行并等待()”而且文本到语音转换不起作用。我猜问题在于线程作用域的规则。正确的? 基本上我想要的是。。主线程中引擎变量的“句柄”。这样我就可以打电话了发动机.停止()从主线程。在

希望我说得通

谢谢


Tags: text引擎文本import程序initdef语音
1条回答
网友
1楼 · 发布于 2024-10-08 19:19:54

全局变量几乎总是一个糟糕的方法。您只需将engine作为参数传递给saythread

def saythread(engine, location, text):
    engine.say(text)
    engine.runAndWait()        

# ...later...

engine = pyttsx.init()                 #(CHANGED) ADDED VARIABLE 
t = threading.Thread(target=saythread,args=(engine, 1, "here we go"),name='sayitthread')
t.start()

但是我敢打赌,真正的问题是您的engine对象上的方法并不是为从其他线程调用而设计的。(范围界定与此无关,顺便说一句,它取决于底层库的设计。)

您可以使用锁来解决问题:

^{pr2}$

…但只有当您同时对engine对象执行它不喜欢的其他操作时,这才有帮助。从你的代码来看,情况似乎并非如此,因此你可能不得不在线程中创建每个引擎对象,并找到另一种方法来传递状态。或者,您可以将engine保留在主线程中,并使用队列从正在执行其他工作的其他线程调用它。在

值得记住的是,并不是所有的Python库(尤其是用C编写的库)都支持线程,所以您必须小心,阅读文档或询问作者。在

相关问题 更多 >

    热门问题