2012-07-10 29 views
13

我寫過一個腳本,它使用兩個線程池,每個線程池都有10個線程來從API中提取數據。線程池實現this code on ActiveState。每個線程池都通過PubSub來監視Redis數據庫的新條目。當一個新條目發佈時,python將數據傳遞給一個函數,該函數使用python的Subprocess.POpen執行一個PHP shell來完成調用API的實際工作。控制python線程的調度優先級?

這個啓動PHP shell的系統對於我的PHP web應用程序的功能來說是必需的,所以用Python啓動PHP shell是不可避免的。

此腳本將只在Linux服務器上運行。

如何控制應用程序線程的niceness(調度優先級)?

編輯:

它似乎在Python控制調度優先級的單個線程是不可能的。是否有python解決方案,或者至少有一個UNIX命令可以與我的腳本一起運行,以控制優先級?

編輯2:

嗯,我最終沒有找到一個Python的方法來處理它。我只是跑我的劇本與漂亮的現在這個樣子:

nice -n 19 python MyScript.py 

回答

11

我相信線程優先級不可控的蟒蛇由於他們是如何使用全局解釋器鎖(GIL)來實現。話雖如此,即使您可以給一個線程更多的CPU處理優先級,那麼圍繞GIL的python實現在交給GIL時也不會意識到這一點。如果你能夠增加池中單個線程的好處(假設它正在做更重要的工作),那麼你需要使用你自己的鎖實現來更頻繁地給予更高優先級的線程訪問GIL。

谷歌搜索返回這篇文章中,我認爲這是類似於你問

解釋了爲什麼它不工作 http://www.velocityreviews.com/forums/t329441-threading-priority.html

解釋我是在暗示 http://bytes.com/topic/python/answers/645966-setting-thread-priorities

+0

感謝您的回答!我現在已經重申了這個問題,詢問我如何能夠爲整個應用程序而不是個人設置計劃優先級。這應該仍然能夠滿足我的需求。如果我沒有收到任何其他回覆,我已經提出了您的回覆,並會選擇您作爲最佳答案。 – Backus 2012-07-10 22:56:08

1

的解決方法我想知道如果this answer at another related question在這種情況下可能會有用? (link

正如你已經在使用Subprocess.POpen啓動你的PHP腳本,它給我的印象,你可以用「preexec_fn」,要麼預定義的函數,或lambda函數(如示上面鏈接的答案)設置每個啓動的PHP線程的好級別?

2

我知道,很多時間已經過去了,但我最近遇到了這個問題,我認爲增加另一個選項會很有用。

看一看threading2,這是一個投遞更換和擴展線程模塊默認,與支持 - 排序 - 爲優先和親和力。