Python time.sleep 需要更长的时间
Posted
技术标签:
【中文标题】Python time.sleep 需要更长的时间【英文标题】:Python time.sleep taking much longer 【发布时间】:2017-05-23 17:40:47 【问题描述】:我正在运行一个 HTTP 服务器(自制,使用 C++),它嵌入了用于服务器端脚本的 Python 解释器。这是一个分叉服务器,但我不在任何父进程中使用任何线程。我不会用 Python 解释器(除了 forks)做任何奇怪的事情。
但是,在其中一个脚本中,在另一个线程中,对 time.sleep(0.1)
的调用可能需要长达一分钟,尤其是第一次调用。
while not self.should_stop():
# other code
print "[PYTHON]: Sleeping"
time.sleep(0.1)
print "[PYTHON]: Slept, checking should_stop"
我知道它挂在这里,因为日志只显示第一个打印件,第二个打印件要很久很久以后。
附加信息:
CPU 未固定 (~5%) 这是 Ubuntu 上的 Python 2.7 这些是threading
线程;我确实在必要时使用了锁和事件。
我不会在任何会执行 fork 的进程中导入 threading
Python 在分叉之前初始化;这在其他地方效果很好(过去 6 个月没有问题)
【问题讨论】:
【参考方案1】:Python 可以一次运行only one threading.Thread
,所以如果有很多线程,解释器必须不断在它们之间切换,这样一个线程可以运行而其他线程得到 冻结,或者换句话说,被打断了。
但是一个被中断的线程并没有被告知它被冻结了,它有点失去知觉一段时间然后被唤醒并从它被中断的地方继续它的工作。因此,一个特定线程的 0.5 秒实际上在现实生活中可能会更长。
【讨论】:
嗨!对不起,但你能提供一个来源,我以前从未听说过这样的事情。谢谢!编辑:另外,只有 2 个线程,为什么其中一个会挂起? 一个小时等待半秒的睡眠将是一个灾难性的线程调度缺陷,即使使用全局解释器锁。 @user2357112,我认为应该很明显这是一种夸张,以表明“滞后”可能非常明显。 一分钟等待 0.1 秒的睡眠,正如问题中所报告的,仍然是一个灾难性的线程调度缺陷。 也许运行时嵌入器(C++ 代码)必须明确允许其他线程运行?【参考方案2】:已修复!
事实证明,主线程(在 C++ 中嵌入解释器的线程)在不执行 Python 代码时(正如我想象的那样)实际上并没有释放 GIL。您实际上必须手动释放 GIL,使用 Py_BEGIN_ALLOW_THREADS
和 Py_END_ALLOW_THREADS
,指定 here。
这使得运行时释放 GIL,以便其他线程可以在 IO 密集型任务期间运行(例如,在我的例子中,读取或写入网络)。不过,这样做时没有运行 Python 代码。
【讨论】:
以上是关于Python time.sleep 需要更长的时间的主要内容,如果未能解决你的问题,请参考以下文章