在使用Python在各种UNIX(Linux,FreeBSD和MacOS X)下处理命名管道(FIFO)时,我注意到了一些奇怪的事情.第一个,也许是最烦人的是尝试打开空闲/空闲FIFO只读将被阻止(除非我使用os.O_NONBLOCK较低级别的os.open()调用).但是,如果我打开它进行读/写,那么我就不会阻塞.
例子:
f = open('./myfifo', 'r')               # Blocks unless data is already in the pipe
f = os.open('./myfifo', os.O_RDONLY)    # ditto
# Contrast to:
f = open('./myfifo', 'w+')                           # does NOT block
f = os.open('./myfifo', os.O_RDWR)                   # ditto
f = os.open('./myfifo', os.O_RDONLY|os.O_NONBLOCK)   # ditto
我只是好奇为什么.为什么打开调用块而不是后续的一些读操作?
另外我注意到非阻塞文件描述符可以表现为Python中的不同行为.在我使用的情况下os.open()与os.O_NONBLOCK初始开启操作那么os.read()似乎如果数据还没有准备好文件描述符返回一个空字符串.但是,如果我使用fcntl.fcnt(f.fileno(), fcntl.F_SETFL, fcntl.GETFL | os.O_NONBLOCK)然后os.read引发异常(errno.EWOULDBLOCK)
是否有一些其他标志open()由我的os.open()例子未设置的法线设置?它们有什么不同,为什么?
这里简单的脚本:
a)不断从套接字读取并在关联数组中存储值
b)不断从stdin读取值并在关联数组中已存在时响应t/f
a&b是随机事件,不以任何方式关联.
诀窍是从两个子进程访问数组(因为在后台放置一个进程会将其作为子进程生成)
我正在考虑最好的策略,并且会出现一些想法,但我想知道是否有人有更好的想法:
1)将输入从套接字重定向到stdin作为子进程并在一个while循环中处理两个输入(数据大小很小,<30个字符,所以我猜它们将保持原子?).
2)读取套接字,然后在读取时使用小(0.1?)超时值读取STDIN,以模仿非阻塞I/O. 
3) UPDATE:将套接字数据写入文件(实际上让其他进程将其直接写入文件),然后每次请求进入以检查该值是否存在时,处理文件中的条目,将它们添加到文件中.数组(使用文件锁定).
我有一个问题,我无法在stackoverflow或网络上的任何地方找到帮助.
我有一个程序(芹菜分布式任务队列),我有多个实例(工人),每个实例都有一个日志文件(celery_worker1.log,celery_worker2.log).
重要的错误存储在数据库中,但我喜欢在运行新操作时不时地拖尾这些日志以确保一切正常(loglevel更低).
我的问题:这些日志占用了大量磁盘空间.我想做什么:能够只在我需要时"观察"日志(tail -f),而不需要占用大量空间.
我的想法到现在为止:
有没有办法有一个非阻塞的命名管道,它会在尾部时抛出stdout,并在没有时抛出/ dev/null?
或者这种管道有技术难题吗?如果有,他们是什么?
谢谢您的回答!
bash ×2
fifo ×2
linux ×2
file-io ×1
io ×1
logging ×1
named-pipes ×1
nonblocking ×1
pipe ×1
posix ×1
subprocess ×1