【问题标题】:Issue when performing non-block writing执行非块写入时的问题
【发布时间】:2018-08-26 01:14:01
【问题描述】:

我写了如下代码来了解非阻塞写是如何操作的:

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(),以便在处理循环时激活,这样我就可以说服自己,写入是在没有阻塞的情况下执行的!然而,循环仍然阻塞并且直到完成才执行该方法。我不确定我的理解是否错误,但据我所知,非阻塞操作允许您在处理写作时执行其他任务。那是对的吗?如果是这样,请问我的代码中的问题在哪里!

谢谢。

【问题讨论】:

    标签: python file asynchronous io nonblocking


    【解决方案1】:

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

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

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

    所以,该标志没有指定非阻塞write,而是非阻塞open。写入仍然是串行的、阻塞的、缓慢的。

    【讨论】:

    • 非常感谢。非阻塞的概念则与从磁盘读取有关。对吗?
    • @SteveMcarthy 这取决于所使用的上下文。在这种情况下,该标志仅在打开文件的上下文中(并且仅在少数情况下被考虑)。
    • @SteveMcarthy 此外,您可能需要考虑“异步 IO”和“非阻塞 IO”的含义不同。请参阅stackoverflow.com/a/983764/4909087 了解更多信息。
    • 有人告诉我写也可以是非阻塞的,这就是我尝试这个例子的原因!谢谢你的澄清
    • @SteveMcarthy 我认为它可以(不确定),但对于常规文件,这个标志肯定会被忽略,我可以保证。
    猜你喜欢
    • 2017-07-20
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2020-02-21
    • 2011-02-18
    • 2021-05-07
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多