程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python的任務調度問題

編輯:Python

python的任務調度問題

  • 首先描述一下現象
  • 嘗試解決方法
  • 思考問題
  • 最終解決
    • 方案1,用線程方式實現
    • 方案2,用函數方式實現循環
    • 方案3,在主程序段實現循環
  • 正常幀率
  • 問題溯源

首先描述一下現象

Win10系統,python編程,進行雙攝像頭采集識別,用到了opencv,由於opencv不支持多進程編程,故而用多線程方式。
程序剛啟動時速度很快,但隨著時間的推移,幾分鐘後程序變得很慢,,其間沒有其他操作,也沒有其他軟件干擾。
下圖發現,CPU的使用率從最開始的60%,一直降到20%,為初始的1/3,而幀率從10+掉到1幀以下,運行效率為1/10,不是應該降到3.3幀才對的麼?

嘗試解決方法

1 在Win10設置中,將電腦設為高性能,無效
2 打開Windows資源監視器發現,CPU使用率從最開始的60%降低到最後的不到20%,下降明顯。但連續監控發現CPU溫度並沒有超標,最高只有68度左右。所以肯定不是過熱導致的CPU降頻。
3 重裝了了電腦,依然如此。
4 運用了CPU鎖頻軟件ThrottleStop,可以鎖住CPU的頻率為最高的睿頻,但依然無法解決CPU占用率往下掉

5 BIOS中一通操作,無效。

思考問題

初步判斷是Win10的任務調度出了問題,導致如此結果。
OpenCV本身是支持多進程的,這一點很容易證明,運行程序,觀察CPU占用率,如下圖

如果它不支持多進程的話,對於我的6核CPU來說,即使單核滿負載,總的CPU使用率最多只能占用到16.67%,而現在CPU占用率超過50%,說明所有核心均有一半的負載,或者有一半的核心已經滿負載,而這肯定是多進程才能做到的。
既然opencv本身支持多進程,那麼我再開多線程就是多此一舉,而且效率肯定會更低。因為Python本身是不支持多進程的。

最終解決

出問題的代碼是這樣的,在主程序中調用函數,在函數中進行無限循環

方案1,用線程方式實現

if __name__ == '__main__':
th0 = threading.Thread(target=camera_detect, args=(0, True, True, True, 280, False))
th0.start

方案2,用函數方式實現循環

改為下面這樣,不用線程的方式,問題依然如故:

if __name__ == '__main__':
camera_detect(0, True, True, True, 280, False)) # 函數內部有一個while循環

方案3,在主程序段實現循環

最終,將無限循環改到主程序中,函數運行一次就返回一次,在主程序中完成循環調用:

if __name__ == '__main__':
while True: # while循環移動到主程序段,問題解決
camera_detect(0, True, True, True, 280, False))

問題解決,由此說明,問題肯定出在任務調度。

正常幀率

問題解決以後,開啟雙攝像頭時,CPU總體使用率為50%左右,兩個攝像頭的幀率均能達到7.5幀/秒,基本滿足運行需要

問題溯源

接下來依然用問題代碼運行程序,
IDE我用的是Pycharm,改為VSCode以後,問題依然。
直接用命令行運行程序,問題依然。
這說明與編譯器無關。
而無限循環是位於主程序,還是位於函數中,這決定了程序最終運行的效率。這說明問題與Win10的任務調度無關,只與Python的任務調度有關。
在主程序中運行的代碼,明顯優先級更高。
函數中的代碼,會因為某種神秘原因,導致運行效率降低。
水平有限,只能分析到這裡,具體原因歡迎留言討論。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved