我从没考虑过,所以写了这个脚本:
import timewhile True: print "loop" time.sleep(0.5)
只是作为测试。通过运行此命令,
strace -o isacontextswitch.strace -s512 pythontest.py可以在循环中获得以下输出:
write(1, "loopn", 5) = 5select(0, NULL, NULL, NULL, {0, 500000}) = 0 (Timeout)write(1, "loopn", 5) = 5select(0, NULL, NULL, NULL, {0, 500000}) = 0 (Timeout)write(1, "loopn", 5) = 5select(0, NULL, NULL, NULL, {0, 500000}) = 0 (Timeout)write(1, "loopn", 5) = 5select(0, NULL, NULL, NULL, {0, 500000}) = 0 (Timeout)write(1, "loopn", 5)select()是系统调用,所以是的,您是上下文切换(从技术上来说,切换到内核空间时实际上不需要上下文切换,但是如果您正在运行其他进程,那么您在这里的意思是除非您已经准备好数据以读取文件描述符,其他进程可以运行到那时)进入内核以执行此操作。有趣的是,延迟是在stdin上选择的。这使python可以根据需要中断诸如输入之类的事件的
ctrl+c输入,而不必等待代码超时-
我认为这很简洁。
我应该注意,
time.sleep(0)除了传入的时间参数为之外,其他情况均相同
{0,0}。而且,自旋锁定对于非常短的延迟而言并不是真正理想的选择,multiprocessing并且
threads具有等待事件对象的能力。
编辑 :所以我看了一下究竟是什么Linux。
do_select(
fsselect.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函数)可能会一直执行到完成为止。
但是,我要重申的一点是,要更好地适应其他进程,最好的方法通常是使用自旋锁以外的其他机制。



