人性的優點
人性的優點,這本書的英文原名是”How to stop worrying & start living”,老實說,我也不知道為何中文會翻譯成”人性的優點”,不過總之,他是一本在講如何消除憂慮的書,和”人性的弱點”同個作者 - 戴爾・卡內基。
技術、閱讀、生活
我們在寫網路相關的程式時,最底層就是與 socket 交互。socket 是專用於網路通訊的 system call。什麼是 system call 呢?我們知道作業系統有分 kernel 和 user space,從 user space 要進行 I/O 操作需要透過 system call 去呼叫 kernel space,因為只有 kernel space 才有權限進行 I/O 的操作。
在 Linux 中,使用 socket 宣告一個 object 會回傳一個 file descriptor。在 Linux 中,一切都是文件,連 socket object 也不例外,file descriptor 在這裡的作用就是指向那個文件的 descriptor。
我們知道,Python 應用在執行時,需要從記憶體中劃出一段空間來存放臨時變數,計算完後再將結果存放到永久儲存介質。如果臨時變數所需的空間過大,會導致 OOM (Out of Memory) 記憶體錯誤,程式可能會被作業系統終止。
對於伺服器應用來說,為了設計永遠不中斷的系統,記憶體管理變得非常重要,否則容易引發記憶體洩漏 (Memory Leak)。
我們的應用程式在執行過程中會不斷向作業系統申請記憶體並釋放記憶體。記憶體洩漏指的是程式沒有釋放已不再使用的記憶體,導致記憶體的浪費,而非被攻擊。
那麼 Python 是怎麼處理的呢?需要工程師們手動申請變數記憶體並清除嗎?答案是:不需要,Python 會自動找出不再使用的變數並釋放記憶體。
之前我們講過了 Python 的 Coroutine,提到了我們用的是 asyncio library。不同於 Coroutine 那一篇,這一篇我們注重於原理的理解。
我們知道,multi-threading 能夠使得效率及 CPU 使用率大大提高,那為什麼我們還需要 Asyncio (Coroutine) 呢?
於是就有了 Asyncio。
無論是哪門程式語言,併發(Concurrent)和並行(Parallel)都是很常用且重要的知識點。舉個例子,像是爬蟲技術被廣泛運用在工業界的資料收集領域,其中的核心技術就是併發並行程式設計。
正確合理地使用併發和並行,無疑會讓我們的程式性能大幅提升。之前我們聊到過Python Coroutine,今天我們來聊聊Python的Futures。
Coroutine(協程)和我們常聽到的 multithread(多執行緒)、multiprocess(多進程)一樣,都是一種併發(concurrent)方式。需要注意的是,併發和併行(parallel)不同,併發是快速的上下文切換,讓使用者感覺程式同時在執行,而併行是指不同 CPU 同時執行多個任務。