执行非块写入时出现问题

时间:2018-03-16 21:24:51

标签: python file asynchronous io nonblocking

我编写了以下代码来了解非阻塞写操作的方式:

import os, time

def takeAnap():
    print('I am sleeping a bit while it is writing!')
    time.sleep(50)

fd = os.open('t.txt', os.O_CREAT | os.O_NONBLOCK)
for i in range(100):
    # Non-blocking write
    fd = os.open('t.txt', os.O_APPEND | os.O_WRONLY | os.O_NONBLOCK)
    os.write(fd, str(i))
    os.close(fd)
    time.sleep(2)
takeAnap()

正如您所看到的,我正在创建takeAnap()以便在处理循环时激活,以便我可以说服自己写作是在没有阻塞的情况下执行的!但是,循环仍会阻塞,并且在完成之前不执行该方法。我不确定我的理解是否错误但据我所知,非阻塞操作允许您在处理写入时执行其他任务。那是对的吗?如果是这样,请问我的代码中的问题在哪里!

谢谢。

1 个答案:

答案 0 :(得分:1)

我认为您误解了O_NONBLOCK标志的用途。这是实际标志的作用:

  

这可以防止打开阻止“长时间”打开文件。   这仅对某些类型的文件有意义,通常是设备   作为串口;当它没有意义时,它是无害的   忽略。

摘自https://www.gnu.org/software/libc/manual/html_node/Open_002dtime-Flags.html

因此,该标志不指定非阻塞,而是非阻塞打开。写作仍然是连续的,阻塞的,慢的。