Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7-Linux-Infinite循环,将CPU交给其他线程/进程_Python_Linux_Multithreading_Sleep_Cpu Usage - Fatal编程技术网

Python 2.7-Linux-Infinite循环,将CPU交给其他线程/进程

Python 2.7-Linux-Infinite循环,将CPU交给其他线程/进程,python,linux,multithreading,sleep,cpu-usage,Python,Linux,Multithreading,Sleep,Cpu Usage,在Python2.7中,是否有办法将剩余的线程/进程分配的时间放弃给其他线程/进程 请不要推荐同步、互斥、信号量等。我要求提供Windows或Linux上的标准机制,用于访问内核函数的代码 让我给你一个简短的C代码示例: int i = 0 while (true) { i++; // this will work on windows: sleep(0); // and this will work on Linux sched_yield(); } 编译并启动

在Python2.7中,是否有办法将剩余的线程/进程分配的时间放弃给其他线程/进程

请不要推荐同步、互斥、信号量等。我要求提供Windows或Linux上的标准机制,用于访问内核函数的代码

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

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时间将代表其他线程/进程放弃

相反,当您执行以下操作时:

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解决方案。

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

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

当您需要空闲线程时,通常会编写如下内容:

while True:
    time.sleep(100000)  # 100000 or another very large number

通过这种方式,您可以减少每秒函数调用的次数,实际上使函数调用所需的时间可以忽略不计。

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

#include <sched.h>

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

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

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

如果你问一个关于你试图实现什么的问题,你可能会得到一个更有用的答案。当使用
睡眠(0)
时,CPU使用率只有在有其他进程运行时才会为0%,并且总CPU使用率不会为0%。e、 我看到一个游戏在它的主要事件循环中使用了这种技术,持续占用了25%的CPU并耗尽了我的电池。安德烈是正确的,尽管CPU的使用量并不是微不足道的。每个sleep()都涉及执行一个系统调用,该调用涉及到内核的上下文切换。这是非常昂贵的,你应该尽量减少他们。事实上,一个重要的优化是最小化此类调用。如果你能找到一种方法来推动唤醒活动,那就更好了。
#!/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()