2015-11-05 54 views
0

我正在使用threading.Timer函数一次运行多个计时器。一旦每个时间过后,调用该函数使用子与“说”命令,如下图所示:检查当前是否在使用Python的任何线程中运行的子进程

subprocess.call(["say", "hello world"]) 

有时计时器后,对方很快熄灭,然后他们开始讨论过对方。我怎样才能让他们相互等待,以便它们不重叠?

我仍然希望能够在发生这种情况时在主程序中做其他事情(比如制作新的计时器),所以我不认为我可以使用popen.wait()或.join()

回答

1

如果say可执行快速运行,你可以锁定它的调用:

​​

如果say可执行文件本身很慢,你将不得不存储它的输出,仅打印出来(再次,有锁)在调用结束时:

lock = threading.Lock() 

def your_thread_function(): 
    # You can also use subprocess.check_output. 
    p = subprocess.Popen(["say", "hello world"], stdout=subprocess.PIPE) 
    out, err = p.communicate() 
    with lock: 
     print(out) 
+0

第一个例子完美适用于我的应用程序,谢谢! – bbqed

+0

@bbqed:一般来说,用一个锁来保护'subprocess.Popen()'是个好主意(它与问题无关,但它避免了多线程和子进程的各种问题(例如,由于平台错误导致的竞争条件) )。 'Popen()'立即返回而不等待子进程完成;因此可以在这里用锁来保护它。 – jfs

相关问题