在MacOSX10.6.2上使用Python2.6.1,我有以下问题:
我有一个线程进程(一个线程类),每个线程都有一个管道(一个subprocess.Popen) --类似于:
from threading import Thread
cmd = "some_cmd"
class Worker(Thread):
def run(self):
pipe = Popen(cmd,
stdin=PIPE,
stdout=PIPE,
stderr=PIPE)
out, err = pipe.communicate("some data")问题是pipe.communicate()代码被阻塞了。有趣的是,当我向父进程发送一个中断(例如Ctrl-C KeyboardInterrupt)时,它就会解除阻塞。
有趣的是,当我使用class Worker(multiprocessing.Process)时,代码工作得很好。
任何关于这一障碍的原因以及如何解决它的想法都将不胜感激。
谢谢。
发布于 2010-03-30 14:45:19
如果在主线程中调用sys.exit(),其他线程将在下一个机会(在大多数操作系统上)终止。但是,如果它们处于阻塞调用(例如communicate())中,则会等到阻塞调用完成后才终止。C之所以工作是因为它会导致操作系统中断阻塞调用。
通常,最安全的方法是确保没有线程调用可能无限期阻塞的函数。不幸的是,这常常涉及到编写更多的代码。
在特定情况下,可以在调用通信之前将Popen对象存储在全局set()中,并在每个对象退出之前让主线程调用它们的Popen.terminate()。这将导致子线程退出、communicate()返回和线程退出。
您是否将线程设置为守护进程线程?
发布于 2010-03-30 06:57:22
使用多个线程和经常会导致问题,特别是在基于Unix的系统上(虽然不完全);我建议您避免将这两者混合在一起。
https://stackoverflow.com/questions/2542423
复制相似问题