Python time.sleep需要更长的时间

时间:2017-05-23 17:40:47

标签: python multithreading boost-python

我正在运行一个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个帖子;我确实在必要时使用锁和事件。
  • 我不会在任何可以进行分叉的过程中导入threading
  • Python在fork之前初始化;这在其他地方很有效(过去6个月没有问题)

2 个答案:

答案 0 :(得分:0)

Python一次可以运行 only one threading.Thread,所以如果有很多线程,解释器必须不断地在它们之间切换,这样一个线程就可以运行其他人得到冻结,换句话说,被打断了。

但是一个被打断的线程并没有被告知它被冻结了,它有一段时间失去意识,然后被唤醒,继续它的工作从那里开始中断。因此,一个特定线程的0.5秒实际上可能在现实生活中变长。

答案 1 :(得分:0)

固定!

事实证明,主线程(在C ++中嵌入解释器的主线程)在没有执行Python代码(我想象的)时实际上并没有释放GIL。您实际上必须使用Py_BEGIN_ALLOW_THREADSPy_END_ALLOW_THREADS手动释放GIL,并按指定的here发布。

这使得运行时释放GIL,因此其他线程可以在IO密集型任务期间运行(例如,在我的情况下,读取或写入/来自网络)。但是,这样做时没有运行Python代码。