我尝试使用系统调用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
代替文件时,它完全正常。
答案 0 :(得分:3)
您使用的是哪种操作系统? Windows或UNIX或MacOS X还是什么?
传统上,类UNIX系统上的select()调用将返回文件为"始终可读"并且"总是可写的"所以尝试使用select()进行I / O多路复用将没有用。
在Windows上,文件上的select()根本不会起作用,因为它是WinSock库的一项功能。
有各种"文件通知"函数和API可能更适合您的特定情况 - Python甚至有一些库可以抽象出特定于操作系统的代码。然而,这不能很好地与套接字进行本地交互,所以我认为最好的方法是让一个程序同时对输入套接字作出反应"和"对文件更改作出反应"不使用轮询,就是创建一个或多个Python线程。