2013-11-20 30 views
3

我知道你可以通过信号量来限制有限资源的使用,但是如何使它适用于CPU(或内核,如果这是明智的做法)。在Linux中用信号量阻塞cpu可能吗? (Python)

我在单个处理器上同时运行多个线程。但是在其中一个线程中,我想运行一段代码来发送一个信号,并且需要时间来让信号恢复。信号看起来非常失真,而过去这些信号一直很好。我肯定硬件工作正常,所以我相信添加这些额外的线程已经使响应脉冲的时间不准确。这是一个非常脆弱的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 

我将插入睡眠()脉冲之间的方法,使得CPU不被锁定了其他线程。

我知道信号量如何工作,问题是,我如何使它在CPU上工作?

+1

我相信,如果这是CPython并且这些是Python线程,那么一次只能运行一个线程。这是因为Python的Global Interpretor Lock(GIL)。您调用的C代码不受GIL支配。进程是另一回事。 – octopusgrabbus

+0

是的,我正在使用CPython。我应该更清楚地澄清......我只有一个处理器,所以恐怕多处理是不可能的。我现在正在考虑使用作业调度程序来模拟线程优先级。这就是维基百科关于什么样的作业调度功能包括:'优先级和/或队列来控制无关作业的执行顺序'。这看起来正是我正在寻找的。所以我会在运行我的代码块之前提高线程的优先级,然后再将优先级恢复为正常。这是推理的好方法吗? – Babyburger

+0

我对线程的了解很老,只限于Microsoft NT。微软希望人们在20世纪90年代后期开始使用他们的工具和技术开始使用线程编程,在多核板出现之前。而且,使用线程在UI中提供了一些有用的效果。然而,有一些不同之处,我认为多线程和进程仍然需要调度并分别在一个处理器上轮流进行。而且,你仍然需要考虑GIL。 – octopusgrabbus

回答

1

CPython无法很好地处理多核系统上CPU绑定的线程,除非您在操作系统中禁用了所有核心,除非其中一个。

下面是关于这一主题的演讲: https://www.youtube.com/watch?v=ph374fJqFPE

CPython的不罚款I/O瓶颈,多线程工作负载,但即使是一个CPU绑定的线程进行的是一个烂摊子在多核。

我建议你考虑使用多处理而不是多线程,除非你是纯粹的I/O限制。那还是使用Jython或IronPython,哪个线程好。

1

处理这类事情的正常方法是调整线程的优先级。不幸的是,你似乎无法在Python中做到这一点。 A previous question详细说明了为什么你不能这样做。我不确定我是否购买了GIL可能会获得的声明。我没有检查过GIL的实现,但实现它的一个显而易见的方法是使用本地线程工具的低级锁定原语(互斥锁等)。通常这些都会尊重线程优先级。不幸的是,如果你不能操纵优先权,那似乎是没有实际意义的。

+0

山姆哈特曼:据我了解,在GIL防止多个线程同时运行,即使是在多处理器环境。但是,我的理解可能非常不完整。 – octopusgrabbus

+0

@octopusgrabus是,GIL防止他人使用多处理。我们仍然在讨论线程的优先级。如果OS选择哪个线程获取GIL你总是可以保证高优先级的线程运行。存在与其他锁相关的问题,如优先级倒置等和死锁避免。 –

+0

明白了。谢谢。 – octopusgrabbus