首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 2.7 - Linux -无限循环,将CPU释放给其他线程/进程

问Python 2.7 - Linux -无限循环,将CPU释放给其他线程/进程
EN

Stack Overflow用户
提问于 2016-02-03 17:22:39
回答 2查看 1.1K关注 0票数 1

在Python2.7中,有没有办法把分配给其他线程/进程的剩余时间留给其他线程/进程?

请不要推荐同步、互斥、信号量和其他任何东西。我要求在Windows或Linux上为访问内核函数的代码提供标准机制。

让我给你一个简短的C代码例子:

代码语言:javascript
复制
int i = 0
while (true) {
   i++;
   // this will work on windows:
   sleep(0);
   // and this will work on Linux
   sched_yield();
}

当你编译并启动上面的代码时,如果你看一看CPU的使用率,它将是0%,因为{ i++,if true/jump }消耗了CPU分配给线程的时间的一小部分。代表其他线程/进程释放剩余的CPU时间。

相反,当你这样做的时候:

代码语言:javascript
复制
i = 0
while 1:
   i = i + 1
   time.sleep(0.001)

在Python中,CPU使用率在很大程度上取决于传递给time.sleep函数的时间。占用的时间越少,CPU的使用率就越高。这对我来说肯定是不能接受的,也不能把时间放在0.1以上。

请确保Linux上的python time.sleep(0)与Windows上的原生函数sleep(0)的工作方式不同。另外,请注意,我没有在Windows上尝试Python,因为我只是在寻找Linux解决方案。

EN

回答 2

Stack Overflow用户

发布于 2016-02-03 17:46:13

使用sched_yield()的循环仍在使用一定数量的CPU时间(接近0%,但不完全为0%)。这个数量可能比等效的Python解决方案要小,因为Python中的函数调用有更多的开销。尽管如此,您的C解决方案几乎是完美的。

如果在循环中增加一个整数,情况会变得更糟:在Python中,这是一个很慢的操作,并且需要创建一个新对象。另外,C int会溢出,Python int会根据需要分配更多的内存。

当你想要一个空闲的线程时,你通常会写下这样的代码:

代码语言:javascript
复制
while True:
    time.sleep(100000)  # 100000 or another very large number

这样,您可以减少每秒的函数调用次数,实际上可以忽略函数调用所需的时间。

票数 1
EN

Stack Overflow用户

发布于 2016-02-03 22:41:26

对我来说,C示例也使用了100%的一个处理器。只是这些100%中的大多数都显示为系统调用所用的时间。我猜是sched_yield()吧。这是我用过的完整的C程序:

代码语言:javascript
复制
#include <sched.h>

int main(int argc, char const *argv[])
{
    int i = 0;

    while (1) {
       i++;
       sched_yield();
    }
    return 0;
}

通过标准库中的ctypes模块使用Python中的C函数可以看到类似的效果。主要区别在于进程和系统时间之间的比率。在Python中,有更多的工作涉及递增整数,以及在动态类型语言中通过代理对象调用C函数。整数可以超出CPU寄存器的位数。代码如下:

代码语言:javascript
复制
#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import ctypes

LIBC = ctypes.CDLL('libc.so.6')
shed_yield = LIBC.sched_yield


def main():
    i = 0
    while True:
        i += 1
        shed_yield()


if __name__ == '__main__':
    main()

在我尝试过的(相当慢的)系统上,系统调用占用了大约50%的处理器负载。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35172937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档