首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在线程中调用pipe.communicate()

在线程中调用pipe.communicate()
EN

Stack Overflow用户
提问于 2010-03-30 02:05:01
回答 2查看 2.6K关注 0票数 4

在MacOSX10.6.2上使用Python2.6.1,我有以下问题:

我有一个线程进程(一个线程类),每个线程都有一个管道(一个subprocess.Popen) --类似于:

代码语言:javascript
复制
 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)时,代码工作得很好。

任何关于这一障碍的原因以及如何解决它的想法都将不胜感激。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-30 14:45:19

如果在主线程中调用sys.exit(),其他线程将在下一个机会(在大多数操作系统上)终止。但是,如果它们处于阻塞调用(例如communicate())中,则会等到阻塞调用完成后才终止。C之所以工作是因为它会导致操作系统中断阻塞调用。

通常,最安全的方法是确保没有线程调用可能无限期阻塞的函数。不幸的是,这常常涉及到编写更多的代码。

在特定情况下,可以在调用通信之前将Popen对象存储在全局set()中,并在每个对象退出之前让主线程调用它们的Popen.terminate()。这将导致子线程退出、communicate()返回和线程退出。

您是否将线程设置为守护进程线程?

票数 1
EN

Stack Overflow用户

发布于 2010-03-30 06:57:22

使用多个线程经常会导致问题,特别是在基于Unix的系统上(虽然不完全);我建议您避免将这两者混合在一起。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2542423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档