这种模式经常出现,但我找不到直接的答案。

一个非关键,不友好的程序可能会

while(True):
    # do some work

使用其他技术和平台,如果要允许该程序热运行(尽可能多地使用CPU周期),但要有礼貌-允许其他正在热运行的程序有效地降低我的速度,您经常会这样写道:
while(True):
    #do some work
    time.sleep(0)

我已经读到了有关后一种方法是否可以在Linux机器上运行的python上实现我所希望的信息的相互矛盾的信息。它是否导致上下文切换,导致我上面提到的行为?

编辑:对于什么是有值(value)的,我们在Apple OSX中尝试了一个小实验(没有方便的linux盒)。这个盒子有4个核心以及超线程,所以我们只用了一个就可以启动8个程序
while(True):
    i += 1

正如预期的那样, Activity 监视器显示8个进程中的每个进程都消耗了95%以上的CPU(显然具有4个内核和超线程,您总共获得800%的CPU)。然后,我们启动了第九个此类程序。现在所有这9个都在85%左右。现在杀死第九个人并启动一个程序
while(True):
    i += 1
    time.sleep(0)

我希望该过程将使用接近0%的资源,而其他8个将运行95%的资源。但是,所有这九个指标的运行率约为85%。因此,在Apple OSX上,sleep(0)似乎没有任何作用。

最佳答案

我从没考虑过,所以写了这个脚本:

import time

while True:
    print "loop"
    time.sleep(0.5)

只是作为测试。使用strace -o isacontextswitch.strace -s512 python test.py运行它可以在循环中为您提供以下输出:
write(1, "loop\n", 5)                   = 5
select(0, NULL, NULL, NULL, {0, 500000}) = 0 (Timeout)
write(1, "loop\n", 5)                   = 5
select(0, NULL, NULL, NULL, {0, 500000}) = 0 (Timeout)
write(1, "loop\n", 5)                   = 5
select(0, NULL, NULL, NULL, {0, 500000}) = 0 (Timeout)
write(1, "loop\n", 5)                   = 5
select(0, NULL, NULL, NULL, {0, 500000}) = 0 (Timeout)
write(1, "loop\n", 5)

select() 是系统调用,所以是的,您在进行上下文切换(从技术上讲,更改到内核空间时实际上不需要上下文切换,但是如果您正在运行其他进程,那么您在这里的意思是除非您有数据准备读取您的文件描述符,其他进程可以运行到那时)进入内核以执行此操作。有趣的是,延迟是在stdin上进行选择的。如果他们愿意的话,这使python可以中断您对诸如ctrl+c输入之类的事件的输入,而不必等待代码超时-我认为这很干净。

我应该注意,除了传递的时间参数是time.sleep(0)以外,它也适用于{0,0}。而且自旋锁定对于任何延迟都不是很理想,但是延迟很短- multiprocessing threads 提供了等待事件对象的能力。

编辑:因此,我看了一下Linux的功能。 do_select(fs\select.c)中的实现进行此检查:
if (end_time && !end_time->tv_sec && !end_time->tv_nsec) {
    wait = NULL;
timed_out = 1;
}

if (end_time && !timed_out)
    slack = select_estimate_accuracy(end_time);

换句话说,如果提供了结束时间并且两个参数均为零(!0 = 1且在C中为true),则将等待时间设置为NULL,并且选择被视为超时。但是,这并不意味着函数会返回给您。它遍历您拥有的所有文件描述符并调用cond_resched,从而潜在地允许另一个进程运行。换句话说,发生的事情完全取决于调度程序。如果与其他进程相比,您的进程一直在浪费CPU时间,则很可能会发生上下文切换。否则,您所在的任务(内核do_select函数)可能会一直执行到完成为止。

但是,我要重申的一点是,要更好地适应其他进程,最好的方法通常是使用自旋锁以外的其他机制。

关于python - Linux下Python的time.sleep(0)的行为-是否引起上下文切换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7273474/

10-12 00:12
查看更多