簡單理解非同步程式設計(python)和非同步程式設計(nodejs)
同步程式設計
同一時間只能做一件事。python
就是同步程式設計(當然,python
也能同步)。
非同步程式設計
同一時間可以做多件事。nodejs
就是非同步程式設計(同理,nodejs
也能非同步)。
舉個例子
測試資料夾test
裡有兩個空的文字檔案1.txt
和2.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
相關文章
- python 網路程式設計----非阻塞或非同步程式設計Python程式設計非同步
- Socket程式設計中的同步、非同步、阻塞和非阻塞(轉)程式設計非同步
- [譯] 非同步程式設計:阻塞與非阻塞非同步程式設計
- 同步、非同步、阻塞、非阻塞的簡單理解非同步
- 深入理解nodejs中的非同步程式設計NodeJS非同步程式設計
- nodejs筆記-非同步程式設計NodeJS筆記非同步程式設計
- 深入理解 Python 非同步程式設計(上)Python非同步程式設計
- 【進階之路】併發程式設計(三)-非阻塞同步機制程式設計
- 《JAVA併發程式設計實戰》原子變數和非阻塞同步機制Java程式設計變數
- 一文徹底搞定(阻塞/非阻塞/同步/非同步)網路IO、併發程式設計模型、非同步程式設計模型的愛恨情仇非同步程式設計模型
- 阻塞式程式設計和非阻塞式程式設計區別程式設計
- 程式設計師的“非程式設計師”之路程式設計師
- 理解阻塞、非阻塞、同步、非同步非同步
- 同步、非同步,阻塞、非阻塞理解非同步
- python之非同步程式設計Python非同步程式設計
- Java網路程式設計和NIO詳解5:Java 非阻塞 IO 和非同步 IOJava程式設計非同步
- 非同步程式設計非同步程式設計
- 你好,JavaScript非同步程式設計—- 理解JavaScript非同步的美妙JavaScript非同步程式設計
- 你好,JavaScript非同步程式設計---- 理解JavaScript非同步的美妙JavaScript非同步程式設計
- Java 網路程式設計 —— 非阻塞式程式設計Java程式設計
- Dart 非同步程式設計和原理Dart非同步程式設計
- Python 非同步程式設計入門Python非同步程式設計
- python非同步IO程式設計(一)Python非同步程式設計
- 非同步程式設計:基於事件的非同步程式設計模式(EAP)非同步程式設計事件設計模式
- Dart 非同步程式設計Dart非同步程式設計
- php非同步程式設計PHP非同步程式設計
- asyncio 非同步程式設計非同步程式設計
- js 非同步程式設計JS非同步程式設計
- 非同步程式設計---Promise非同步程式設計Promise
- Javascript 非同步程式設計JavaScript非同步程式設計
- JavaScript非同步程式設計JavaScript非同步程式設計
- 使用非同步程式設計非同步程式設計
- java非同步程式設計Java非同步程式設計
- 程式設計師OR非程式設計師,有些程式設計的事需要知道程式設計師
- Golang非同步程式設計方式和技巧Golang非同步程式設計
- 同步、非同步、阻塞和非阻塞非同步
- 美女程式設計師觀點:程式設計師最重要的非程式設計技巧程式設計師
- 三種Javascript(NodeJS)非同步程式設計程式碼模式比較JavaScriptNodeJS非同步程式設計模式