Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python时间。睡眠时间要长得多_Python_Multithreading_Boost Python - Fatal编程技术网

Python时间。睡眠时间要长得多

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"

我正在运行一个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
  • 这些是
    线程
    线程;我会在必要时使用锁和事件
  • 我不会在任何会执行fork的进程中导入
    线程
  • Python在forks之前初始化;这在其他地方效果很好(过去6个月没有问题)
Python可以一次运行
线程。线程
,因此,如果有许多线程,解释器必须在它们之间不断切换,这样一个线程可以运行,而其他线程则被冻结或中断

但是被中断的线程并没有被告知它已经冻结了,它会昏迷一段时间,然后被唤醒,从被中断的地方继续工作。因此,在现实生活中,一个特定线程的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++代码)必须显式允许其他线程运行?