对文件使用系统调用 select
Use the system call select with files
我正在尝试使用系统调用 select
编写单线程非阻塞程序。但是,它不能很好地使用文件处理程序。
代码如下:
import sys
import select
while True:
file_handler = open('filename.txt')
inputs = [file_handler, sys.stdin]
try:
_input, _output, _error = select.select(inputs, [], [])
except select.error, e:
print e
for i in _input:
txt = i.readline()
if len(txt) > 0:
print 'txt:', txt
当有来自 stdin 的新输入时它到达打印消息,但当新行写入文件时则不会。
当使用 sockets
而不是文件时,它工作得很好。
您使用的是哪个操作系统? Windows 或 UNIX 或 MacOS X 或什么?
传统上,类 UNIX 系统上的 select() 调用会将 return 文件作为 "always readable" 和 "always writable",因此尝试使用 select( ) 对于 I/O 多路复用将没有用。
在 Windows 上,文件上的 select() 根本无法工作,因为它是 WinSock 库的一项功能。
有各种 "file notify" 函数和 API 可能更适合您的特定情况——Python 甚至有一些库可以抽象出 OS 特定代码。但是,它本身不会很好地与套接字交互,所以我认为在不使用轮询的情况下获得 "reacts to input sockets" 和 "reacts to file changes" 程序的最佳方法是创建一个或多个 Python 线程。
我正在尝试使用系统调用 select
编写单线程非阻塞程序。但是,它不能很好地使用文件处理程序。
代码如下:
import sys
import select
while True:
file_handler = open('filename.txt')
inputs = [file_handler, sys.stdin]
try:
_input, _output, _error = select.select(inputs, [], [])
except select.error, e:
print e
for i in _input:
txt = i.readline()
if len(txt) > 0:
print 'txt:', txt
当有来自 stdin 的新输入时它到达打印消息,但当新行写入文件时则不会。
当使用 sockets
而不是文件时,它工作得很好。
您使用的是哪个操作系统? Windows 或 UNIX 或 MacOS X 或什么?
传统上,类 UNIX 系统上的 select() 调用会将 return 文件作为 "always readable" 和 "always writable",因此尝试使用 select( ) 对于 I/O 多路复用将没有用。
在 Windows 上,文件上的 select() 根本无法工作,因为它是 WinSock 库的一项功能。
有各种 "file notify" 函数和 API 可能更适合您的特定情况——Python 甚至有一些库可以抽象出 OS 特定代码。但是,它本身不会很好地与套接字交互,所以我认为在不使用轮询的情况下获得 "reacts to input sockets" 和 "reacts to file changes" 程序的最佳方法是创建一个或多个 Python 线程。