在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解决方案。
发布于 2016-02-03 17:46:13
使用sched_yield()的循环仍在使用一定数量的CPU时间(接近0%,但不完全为0%)。这个数量可能比等效的Python解决方案要小,因为Python中的函数调用有更多的开销。尽管如此,您的C解决方案几乎是完美的。
如果在循环中增加一个整数,情况会变得更糟:在Python中,这是一个很慢的操作,并且需要创建一个新对象。另外,C int会溢出,Python int会根据需要分配更多的内存。
当你想要一个空闲的线程时,你通常会写下这样的代码:
while True:
time.sleep(100000) # 100000 or another very large number这样,您可以减少每秒的函数调用次数,实际上可以忽略函数调用所需的时间。
发布于 2016-02-03 22:41:26
对我来说,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;
}通过标准库中的ctypes模块使用Python中的C函数可以看到类似的效果。主要区别在于进程和系统时间之间的比率。在Python中,有更多的工作涉及递增整数,以及在动态类型语言中通过代理对象调用C函数。整数可以超出CPU寄存器的位数。代码如下:
#!/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%的处理器负载。
https://stackoverflow.com/questions/35172937
复制相似问题