【问题标题】:How is waiting for I/O or waiting for a lock to be released implemented?等待 I/O 或等待释放锁是如何实现的?
【发布时间】:2013-03-26 19:02:31
【问题描述】:

我很好奇。我已经用 Python 编程多年了。当我运行一个阻塞 I/O 的命令(无论是硬盘读取还是网络请求),或者在等待释放锁时阻塞,这是如何实现的?线程如何知道何时重新获取 GIL 并重新开始运行?

我想知道这是否是通过不断检查(“输出现在在这里吗?现在在这里吗?现在呢?”)来实现的,我认为这很浪费,或者以更优雅的方式。

【问题讨论】:

  • 我不是 Python 开发人员,所以请对这条评论持保留态度。 I/O 执行是由操作系统执行的,而语言运行时只是围绕它进行的。例如,Windows 总是提供同步 I/O 操作,但运行时提供在不同线程上运行 I/O 的方法。这些线程本身使用中断通知数据。类似的事情应该是锁。检查是否释放锁,如果没有释放 CPU,则将 CPU 交还给运行不同线程一段时间的 OS 调度程序,并定期将控制权返回给锁检查代码。

标签: python multithreading io


【解决方案1】:

无需重复检查 I/O 完成或锁定释放。

I/O 完成,由驱动程序的硬件中断发出信号,或由另一个线程的软件中断发出的锁释放信号,将使等待这些操作的线程“立即”准备好,并且很可能正在运行,并且很可能在运行时抢占另一个线程。本质上,在软件或硬件中断之后,操作系统可以决定中断——返回到与被中断线程不同的线程。

这种机制的高 I/O 性能,消除了任何轮询或检查,是 99% 的原因可以忍受先发制人的多任务处理者的痛苦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2010-10-15
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多