栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Linux下Python的time.sleep(0)的行为-是否引起上下文切换?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux下Python的time.sleep(0)的行为-是否引起上下文切换?

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

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函数)可能会一直执行到完成为止。

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/669120.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号