对文件使用系统调用 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 线程。