Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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/6/xamarin/3.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
在Linux中可能使用信号量阻塞cpu吗?(Python)_Python_Linux_Cpu_Semaphore_Processor - Fatal编程技术网

在Linux中可能使用信号量阻塞cpu吗?(Python)

在Linux中可能使用信号量阻塞cpu吗?(Python),python,linux,cpu,semaphore,processor,Python,Linux,Cpu,Semaphore,Processor,我知道可以通过信号量限制有限资源的使用,但是如何将其应用于CPU(或者内核,如果这样做是明智的话) 我在一个处理器上同时运行多个线程。但是在其中一个线程上,我想运行一段代码,在那里我发送一个信号,我需要计算信号返回所需的时间。这些信号似乎非常失真,而在过去这些信号一直很好。我肯定硬件工作正常,所以我相信添加这些额外线程会使响应脉冲的计时不准确。这是一个非常弱的cpu。我想尝试阻止cpu做任何事情,但检索和计时返回脉冲;我相信这是可能的 下面是我试图实现的目标的简要说明: -multiple th

我知道可以通过信号量限制有限资源的使用,但是如何将其应用于CPU(或者内核,如果这样做是明智的话)

我在一个处理器上同时运行多个线程。但是在其中一个线程上,我想运行一段代码,在那里我发送一个信号,我需要计算信号返回所需的时间。这些信号似乎非常失真,而在过去这些信号一直很好。我肯定硬件工作正常,所以我相信添加这些额外线程会使响应脉冲的计时不准确。这是一个非常弱的cpu。我想尝试阻止cpu做任何事情,但检索和计时返回脉冲;我相信这是可能的

下面是我试图实现的目标的简要说明:

-multiple threads are running
-on the thread with the pulse signaling a pulse has been sent
 --> stop cpu from processing other threads
 --> return pulse has been received
 --> cpu is now free to continue it's work
我将在脉冲之间插入sleep()方法,这样cpu就不会被其他线程锁定


我知道信号量是如何工作的,问题是,我如何让它在cpu上工作?

CPython不能很好地处理多核系统上cpu绑定的线程,除非在操作系统中禁用除一个内核之外的所有内核

以下是关于该主题的演示:

CPython对于I/O绑定的多线程工作负载来说很好,但即使是一个CPU绑定的线程也会在多核上造成混乱


<>我建议您考虑使用多重处理而不是多线程,除非您是纯I/O绑定的。或者使用Jython或IronPython,这两种线程都很好。

处理这类事情的正常方法是调整线程的优先级。不幸的是,在Python中似乎无法做到这一点。A详细介绍了你为什么不能做这件事。我不确定我是否相信GIL会成为阻碍的说法。我没有研究GIL的实现,但实现GIL的一个明显方法是使用本机线程工具的低级锁定原语(互斥体等)。通常情况下,它们确实尊重线程优先级。不幸的是,如果您不能操纵优先级,这似乎没有意义。

我相信如果这是CPython,而这些是Python线程,那么一次只能运行一个线程。这是因为Python的全局解释器锁(GIL)。您调用的C代码不受GIL的控制。过程是另一回事。是的,我用的是CPython。我应该更清楚地说明这一点。。。我只有一个处理器,所以恐怕不可能有多个处理器。我现在正在考虑使用作业调度器来模拟线程优先级。这就是维基百科关于作业调度功能所包含的内容:“控制不相关作业执行顺序的优先级和/或队列”。这正是我要找的。因此,在运行代码块之前,我会提高线程的优先级,然后再将优先级恢复到正常水平。这是一种很好的推理方式吗?我对线程的了解很老,而且仅限于Microsoft NT。早在20世纪90年代末,在多核主板出现之前,微软就想让人们开始使用他们的工具和技术使用线程编程。而且,在UI中使用线程确实提供了一些有用的效果。然而,尽管存在一些差异,我认为多线程和进程仍然需要调度,并在一个处理器上分别轮换。而且,你仍然需要考虑GIL。这里有一个链接到GIL的描述。我关于线程同时运行的观点在前面已经提到了。Sam Hartman:据我所知,GIL防止多线程同时运行,即使在多处理器环境中也是如此。然而,我的理解可能非常不完整。@octopusgrabus是的,GIL阻止了多重处理的使用。我们仍然在讨论线程优先级。如果操作系统选择哪个线程获得GIL,您可以始终保证高优先级线程运行。存在与其他锁相关的问题,如优先级反转等和死锁避免。