0

我正在尝试使用系统调用编写单线程非阻塞程序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

当有来自标准输入的新输入时,它会到达打印消息,但不会在向文件写入新行时。sockets使用而不是文件时它工作得很好。

4

1 回答 1

4

您使用的是哪个操作系统?Windows 或 UNIX 或 MacOS X 还是什么?

传统上,类 UNIX 系统上的 select() 调用将返回“始终可读”和“始终可写”的文件,因此尝试使用 select() 进行 I/O 多路复用将没有用处。

在 Windows 上,文件上的 select() 根本不会起作用,因为它是 WinSock 库的一个功能。

有各种“文件通知”函数和 API 可能更适合您的特定情况——Python 甚至有一些库可以抽象操作系统特定的代码。但是,这不会与套接字很好地交互,所以我相信在不使用轮询的情况下,让程序“对输入套接字做出反应”和“对文件更改做出反应”的最佳方法是创建一个或多个 Python 线程.

于 2016-03-17T19:03:22.170 回答