Python的异步文件IO操作
2013-11-10 16:27
260 查看
前一篇提到了用subprocess进行与应用的stdin和stdout交互,目前还是stdout处理得多。项目有这样的要求,需要代码能过同时在Linux和Windows下用,为防止应用挂起,需要进行异步IO操作,这样可通过timeout来处理超时。
麻烦问题又来了:Python2.7.x和Python3.2下的Popen都没有提供基于文件的异步IO操作,且项目必须使用Python2.x,应为较多第三方的库没有Python3.x的版本。
整理了一下异步IO的方法,其实是workaround
1,如果在Linux下,可用用select来处理超时,以此实现异步IO;但在Windows下的select不支出file对象--只支持socket对象,这个方法可以毙掉了。
2,应用有stdout可以获取,那么必然可以将此stdout重定向到文件,然后再对此文件进行read操作。这样对file的read就不会blocking,每读取一行数据就进行退出条件检查以及超时检查,遇到EOF时可进行sleep,然后再continue,再read -- 此时应用还在向文件写入数据,直到满足退出条件或者timeout。如果也需要获取stderr的话,可以把stderr指向stdout,如 'app > output.txt 2<&1'。次方法在Linux和Windows下通用,实践可行,目前没发现有什么大硬伤。
3,重载Popen,实现异步IO操作,尝试了下,bug多,难满足需求,只因本人功力太浅啊。
Reference: Asynchronous I/O For subprocess. Popen PEP-3145
麻烦问题又来了:Python2.7.x和Python3.2下的Popen都没有提供基于文件的异步IO操作,且项目必须使用Python2.x,应为较多第三方的库没有Python3.x的版本。
整理了一下异步IO的方法,其实是workaround
1,如果在Linux下,可用用select来处理超时,以此实现异步IO;但在Windows下的select不支出file对象--只支持socket对象,这个方法可以毙掉了。
2,应用有stdout可以获取,那么必然可以将此stdout重定向到文件,然后再对此文件进行read操作。这样对file的read就不会blocking,每读取一行数据就进行退出条件检查以及超时检查,遇到EOF时可进行sleep,然后再continue,再read -- 此时应用还在向文件写入数据,直到满足退出条件或者timeout。如果也需要获取stderr的话,可以把stderr指向stdout,如 'app > output.txt 2<&1'。次方法在Linux和Windows下通用,实践可行,目前没发现有什么大硬伤。
3,重载Popen,实现异步IO操作,尝试了下,bug多,难满足需求,只因本人功力太浅啊。
Reference: Asynchronous I/O For subprocess. Popen PEP-3145
相关文章推荐
- Python中的文件IO操作(读写文件、追加文件)
- Python 12:Python 文件io操作模块
- 我与python约个会:29.企业级开发进阶1:文件输入输出流[IO操作]
- 文件操作 异步IO
- Python入门程序:文件操作和IO异常
- Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化
- Python学习-文件操作IO
- 函数知识及文件IO操作(python快速入门精华切记03)
- python文件IO操作
- Python笔记-IO同步和异步、 读写文件、StringIO和BytesIO
- Python文件基础操作(IO入门1)
- Python 文件IO操作的补充说明
- Python之IO-文件的操作
- 【Python学习笔记】IO编程:操作文件和目录
- Python基础之IO文件目录的操作
- Python学习:IO基础(2):对文件目录的操作
- python -- 文件和IO操作
- Python文件操作IO open 读-取-写
- Python: IO操作(文件操作)
- Python中的文件IO操作(读写文件、追加文件)