使用系统调用select with files

时间:2016-03-17 18:48:09

标签: python unix system-calls nonblocking single-threaded

我尝试使用系统调用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代替文件时,它完全正常。

1 个答案:

答案 0 :(得分:3)

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

传统上,类UNIX系统上的select()调用将返回文件为"始终可读"并且"总是可写的"所以尝试使用select()进行I / O多路复用将没有用。

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

有各种"文件通知"函数和API可能更适合您的特定情况 - Python甚至有一些库可以抽象出特定于操作系统的代码。然而,这不能很好地与套接字进行本地交互,所以我认为最好的方法是让一个程序同时对输入套接字作出反应"和"对文件更改作出反应"不使用轮询,就是创建一个或多个Python线程。