python進階07併發之三其他問題

原創博客地址:python進階07併發之三其他問題

何時使用多進程(線程)

使用多進程or線程,對於python,考慮到GIL鎖,基本上默認使用多進程就對了。
除此之外,線程共享全局變量,進程全局變量則是隔離的,實際進程大多數情況需要通信的,所以也需要考慮共享數據讀寫問題處理。 決定因素穩定性和數據共享要求上(操作系統差異性,win偏好線程,linux偏好進程)
性能上雖然線程較好,但實際除了大型互聯網公司和部分專業性質軟件,大多數中小型公司的併發量,並不會帶來很大影響,況且目前服務器領域,基本上LInux和Unix佔比較高,線程相比進程在性能上優勢並不十分突出。所以這方面考量不會太大的。

以下幾種情況可考慮多進程(線程)

 

1
2
3
循環(互相獨立,無內部依賴)
耗時操作,批量下載IO等操作,典型的是網絡爬蟲
分叉型計算,典型的是分治算法,或mapreduce的map階段

python多線程既然有GIL鎖爲何還需要加鎖

Python已經有一個GIL來保證同一時間只能有一個線程來執行了,爲什麼這裏還需要lock? 注意啦,這裏的lock是用戶級的lock,跟那個GIL沒關係 ,具體我們通過下圖來看一下

簡單來說就是,“GIL同一時間只有一個線程執行”是微觀層面鎖,但我們需要加鎖的是宏觀層面鎖
比如 鎖(process_a1,process_a2,process_a3),和 鎖(process_b1,process_b2,process_b3),如果去掉鎖,僅僅依賴GIL的機制,則可能出現:process_a1,process_b1,process_a2.process_b2,process_a3,process_b3,可能導致錯誤數據出現.

相比之下,協程裏的多線程(的共享數據訪問)則是不需要加鎖的!因爲從用戶層面看,協程是多線程的。但虛擬機層面,其實單線程的,協程內部進行cpu執行權利的自行控制。關於單線程實現多線程併發執行,可參考 博文”併發之一基本概念的事件模型部分”。

同進程不同線程可運行在不同核心上?

這個還要看編程語言的線程模型。某些語言(如python)的線程模型不支持並行運行在多個核上
實際上有些操作系統在內部並不分進程和線程,調度方式是一致的。比如Linux,共享內存的就是線程,不共享內存的就是進程,然後把包裝好的創建函數暴露給POSIX API。
現在同一進程下的多個線程是可以在多核CPU下並行運行的。但2.4內核及以前的系統實現的線程沒有內核支持,無法在多核的情況下並行運行。
多線程的概念主要有兩種:一種是用戶態多線程;一種是內核態多線程
內核態多線程,如樓上所言,在操作系統內核的支持下可以在多核下並行運行;
對於用戶態多線程,儘管沒有內核的直接支持,但若一個用戶態線程對應於內核的一個進程的話(從這個角度,內核還是間接支持的),仍然是可以在多核上並行運行的。
因此,這歸結爲,用戶態多線程的實現技術。
似乎目前Linux上的用戶態多線程,就是利用了內核的進程來實現的。
如果是內核線程(就是fork出來的,pthread_create在2.4後最終也用fork,具體參看其實現),那麼可以調度到多cpu,內核支持線程的誘導因素之一就是可以利用多cpu資源進行並行計算;如果是用戶線程,那麼就不能在多cpu上並行計算了,用戶庫線程的弊端之一就是不能利用多cpu資源;

線程是併發還是並行,進程是併發還是並行?

線程是併發進程是並行
現代os都將線程作爲最小調度單位,進程作爲資源分配的最小單位

父子進程如何區分?

​ 子進程是父進程通過fork()產生出來的,pid = os.fork()
​ 通過返回值pid是否爲0,判斷是否爲子進程,如果是0,則表示是子進程
​ 由於 fork() 是 Linux 上的概念,所以如果要跨平臺,最好還是使用 subprocess 模塊來創建子進程。

子進程如何回收?

python中採用os.wait()方法用來回收子進程佔用的資源
pid, result = os.wait() # 回收子進程資源 阻塞,等待子進程執行完成回收
如果有子進程沒有被回收的,但是父進程已經死掉了,這個子進程就是殭屍進程。孤兒進程,父類進程over.,子進程未結束

使用多處理池的apply_async方法時,誰運行回調

回調在主進程中處理,但單獨線程(循環方式依次處理)
參考:使用多處理池的apply_async方法時,誰運行回調?

異常處理,異常消失問題

參考

進程和線程、協程的區別
進程 vs. 線程
以Python爬取數據爲例,多線程和多進程的優劣
在多核CPU下,同一進程下的多個線程可以並行運行嗎
python併發編程之多進程(實踐篇)
python多進程原理及其實現(1-6總結,較好)
python之路多進程和多線程總結(四)
一文看懂Python多進程與多線程編程(工作學習面試必讀)
搞定python多線程和多進程(詳細)
Python的進程間通信
Python進程間共享數據(三)(dict、list)
多進程,多線程,協程實現簡單舉例
異步IO、多線程、多進程
Python開發【第九章】:線程、進程和協程
multiprocess模塊使用進程池調用apply_async()提交的函數及回調函數不執行問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章