簡單理解非同步程式設計(python)和非同步程式設計(nodejs)

Xavier Jiezou發表於2020-11-18

同步程式設計

同一時間只能做一件事。python就是同步程式設計(當然,python也能同步)。

非同步程式設計

同一時間可以做多件事。nodejs就是非同步程式設計(同理,nodejs也能非同步)。

舉個例子

測試資料夾test裡有兩個空的文字檔案1.txt2.txt

├─test
   ├─1.txt
   ├─2.txt

我想完成兩個任務:

  • 1.txt寫入hello
  • 刪除2.txt檔案

同步實現

# 匯入模組
import os
# 寫入操作
with open('1.txt', 'w') as f:
    f.write('hello')
print('寫入完成')
# 刪除操作
os.unlink('2.txt')
print('刪除完成')
'''輸出結果
寫入完成
刪除完成
'''

非同步實現

// 匯入模組
const fs = require('fs')
// 寫入操作
fs.writeFile('1.txt', 'hello', (err) => {
    if (err) throw err
    console.log('寫入完成')
})
// 刪除操作
fs.unlink('2.txt', (err) => {
    if (err) throw err
    console.log('刪除完成')
})
/* 輸出結果
刪除完成
寫入完成
*/

執行結果

  • python的程式碼先輸出寫入完成,再輸出刪除完成
  • nodejs的程式碼先輸出刪除完成,後輸出寫入完成

分析解釋

python是同步程式設計,同一時間只能做一件事。python的程式碼按順序從上到下執行,先執行寫入操作,再列印輸出,然後執行刪除操作,最後列印輸出。也就是說python下一步的程式碼必須等待上一步的程式碼執行完畢後才能執行,所以python的程式碼先輸出寫入完成,再輸出刪除完成

nodejs是非同步程式設計,同一時間可以做多件事。nodejs的程式碼同時執行寫入操作和刪除兩個操作,這兩個任務之間無需等待。此外,刪除操作直接刪就完事了,而寫入操作要複雜一些,寫入操作的時間要比刪除操作的時間長,所以nodejs的程式碼先輸出刪除完成,而後輸出寫入完成

擴充思維

很明顯,對於舉的這個栗子來說,nodejs程式碼的執行效率要比python程式碼的執行效率高,因為nodejs是同時執行連個任務,而python是等待一個任務完成後再執行下一個任務。

這裡的檔案寫入和檔案刪除兩個操作之間互不影響,但很多時候,多個任務或事件之間具有關聯性,也就是說你必須先處理任務一,等待任務一完成後你才能處理任務二,非同步程式設計就發揮不出優勢了,還得同步程式設計。

因此,採用同步程式設計還是非同步程式設計還得看實際情況。如果你的專案是爬蟲這種批量而又互斥的任務時,採用非同步程式設計效率要高很多。但,如果涉及到流程控制類的任務時,還是需要同步程式設計。

引用參考

https://nodejs.org/api/fs.html
https://docs.python.org/3/library/os.html

相關文章