我正在运行一个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"
我知道这就是它悬挂的地方,因为日志只显示第一个印刷品,而第二个印刷品显示的很晚。
其他信息:
threading
个帖子;我确实在必要时使用锁和事件。threading
答案 0 :(得分:0)
Python一次可以运行 only one threading.Thread
,所以如果有很多线程,解释器必须不断地在它们之间切换,这样一个线程就可以运行其他人得到冻结,换句话说,被打断了。
但是一个被打断的线程并没有被告知它被冻结了,它有一段时间失去意识,然后被唤醒,继续它的工作从那里开始中断。因此,一个特定线程的0.5秒实际上可能在现实生活中变长。
答案 1 :(得分:0)
固定!
事实证明,主线程(在C ++中嵌入解释器的主线程)在没有执行Python代码(我想象的)时实际上并没有释放GIL。您实际上必须使用Py_BEGIN_ALLOW_THREADS
和Py_END_ALLOW_THREADS
手动释放GIL,并按指定的here发布。
这使得运行时释放GIL,因此其他线程可以在IO密集型任务期间运行(例如,在我的情况下,读取或写入/来自网络)。但是,这样做时没有运行Python代码。