Python3:Threadsafe机制重定向stdin,stdout,stderr

时间:2017-08-24 20:35:02

标签: python multithreading python-3.x io synchronization

我正在尝试在python中重定向调试程序的stdin,stdout和stderr,并通过将StringIO实例分配给sys.stdin / out / err来快速看到其他人取得了成功。

但是,调试的程序在一个线程中,而StringIO实例正在使用不同的线程写入和读取。我找不到任何文档描述StringIO对象是线程安全的,虽然我可以在锁中包装我自己的读/写调用,但我认为我不能强制调试程序使用这些相同的锁。

我如何强制StringIO做我想做的事情?否则,什么会做我想要的?

修改 根据要求,预期竞争条件的示例如下:

让我说我正在阅读stdout。我读了StringIO的全部内容,然后刷新对象...除了我的读取和刷新操作之间,调试的程序已经打印了更多的信息,最终也被刷新了。换句话说,我失去了一些信息。

编辑2: 我发现另一个问题基本上是问the same question,但他的答案看起来并不是非常pythonic,所以我要离开这个

1 个答案:

答案 0 :(得分:0)

我在浏览Qdb的源代码时遇到了答案。此实现将 stdin stdout stderr 重新分配给self,并实现以下类似文件的函数:

close
encoding
isatty
flush
writelines
write
readlines
readline

现在,因为所有io函数都在你的类中(假设你正在使用类),你可以整天控制同步。