Python のビルトイン Queue クラスを使用して、適切な結果を得ることができます。
import pyttsx
from Queue import Queue
from threading import Thread
q = Queue()
def say_loop():
engine = pyttsx.init()
while True:
engine.say(q.get())
engine.runAndWait()
q.task_done()
def another_method():
t = Thread(target=say_loop)
t.daemon = True
t.start()
for i in range(0, 3):
q.put('Sally sells seashells by the seashore.')
print "end of another method..."
def third_method():
q.put('Something Something Something')
if __name__=="__main__":
another_method()
third_method()
q.join() # ends the loop when queue is empty
上記は、私が作成した簡単な例です。「キュー/コンシューマー」モデルを使用して、個別の関数/クラスが同じキューにアクセスできるようにし、キューにアイテムがあるときはいつでも実行されるワーカーを許可します。あなたのニーズに適応するのはかなり簡単なはずです。
Queues についてさらに読む: https://docs.python.org/2/library/queue.html
リンク先のドキュメントにはこのためのインターフェイスがあるようですが、すでに別のスレッド トラックにいるように見えたので、これはあなたが望んでいたものに近いように見えました。
コードの修正版は次のとおりです。
import pyttsx
from Queue import Queue
import threading
class VoiceAssistant(threading.Thread):
def __init__(self):
super(VoiceAssistant, self).__init__()
self.engine = pyttsx.init()
self.q = Queue()
self.daemon = True
def add_say(self, msg):
self.q.put(msg)
def run(self):
while True:
self.engine.say(self.q.get())
self.engine.runAndWait()
self.q.task_done()
if __name__ == '__main__':
va = VoiceAssistant()
va.start()
for i in range(0, 3):
va.add_say('Sally sells seashells by the seashore.')
print "now we want to exit..."
va.q.join() # ends the loop when queue is empty