2013-11-20 29 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