Python时间。睡眠时间要长得多
我正在运行一个HTTP服务器(自制的,用C++编写),它嵌入了一个用于服务器端脚本编写的Python解释器。这是一个分叉服务器,但我不在任何父进程中使用任何线程。我不会用Python解释器做任何奇怪的事情(除了forks) 但是,在其中一个脚本中,在另一个线程中,调用Python时间。睡眠时间要长得多,python,multithreading,boost-python,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)
可能需要一分钟,尤其是第一次调用
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
- 这些是
线程;我会在必要时使用锁和事件线程
- 我不会在任何会执行fork的进程中导入
线程
- Python在forks之前初始化;这在其他地方效果很好(过去6个月没有问题)
线程。线程
,因此,如果有许多线程,解释器必须在它们之间不断切换,这样一个线程可以运行,而其他线程则被冻结或中断
但是被中断的线程并没有被告知它已经冻结了,它会昏迷一段时间,然后被唤醒,从被中断的地方继续工作。因此,在现实生活中,一个特定线程的0.5秒实际上可能更长。修复
事实证明,主线程(在C++中嵌入解释器的线程)在不执行Python代码时(正如我想象的那样)实际上并没有释放GIL。实际上,您必须手动释放GIL,使用指定的Py\u BEGIN\u ALLOW\u THREADS
和Py\u END\u ALLOW\u THREADS
这使得运行时可以释放GIL,以便其他线程可以在IO密集型任务期间运行(例如,在我的例子中,读取或写入网络)。不过,在执行此操作时,不要运行Python代码。Hi!对不起,你能提供一个消息来源吗?我以前从未听说过这样的消息。谢谢编辑:还有,只有两个线程,为什么其中一个会挂起?一个小时等待半秒睡眠将是一个灾难性的线程调度缺陷,即使有全局解释器锁。@user2357112,我认为这显然是一种夸张,显示“滞后”可能非常明显。如问题中所述,等待0.1秒睡眠一分钟仍然是一个灾难性的线程调度缺陷。也许运行时嵌入程序(C++代码)必须显式允许其他线程运行?