簡單理解非同步程式設計(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
相關文章
- [譯] 非同步程式設計:阻塞與非阻塞非同步程式設計
- 深入理解nodejs中的非同步程式設計NodeJS非同步程式設計
- nodejs筆記-非同步程式設計NodeJS筆記非同步程式設計
- 【進階之路】併發程式設計(三)-非阻塞同步機制程式設計
- python之非同步程式設計Python非同步程式設計
- 《JAVA併發程式設計實戰》原子變數和非阻塞同步機制Java程式設計變數
- Python_非同步程式設計-併發程式設計-協程和futurePython非同步程式設計
- 一文徹底搞定(阻塞/非阻塞/同步/非同步)網路IO、併發程式設計模型、非同步程式設計模型的愛恨情仇非同步程式設計模型
- 阻塞式程式設計和非阻塞式程式設計區別程式設計
- Python 非同步程式設計入門Python非同步程式設計
- python非同步IO程式設計(一)Python非同步程式設計
- 非同步程式設計非同步程式設計
- Java網路程式設計和NIO詳解5:Java 非阻塞 IO 和非同步 IOJava程式設計非同步
- 你好,JavaScript非同步程式設計—- 理解JavaScript非同步的美妙JavaScript非同步程式設計
- 你好,JavaScript非同步程式設計---- 理解JavaScript非同步的美妙JavaScript非同步程式設計
- Java 網路程式設計 —— 非阻塞式程式設計Java程式設計
- 理解阻塞、非阻塞、同步、非同步非同步
- 同步、非同步,阻塞、非阻塞理解非同步
- Dart 非同步程式設計和原理Dart非同步程式設計
- 非同步程式設計:基於事件的非同步程式設計模式(EAP)非同步程式設計事件設計模式
- java非同步程式設計Java非同步程式設計
- asyncio 非同步程式設計非同步程式設計
- 非同步程式設計 CompletableFuture非同步程式設計
- Dart 非同步程式設計Dart非同步程式設計
- Javascript 非同步程式設計JavaScript非同步程式設計
- php非同步程式設計PHP非同步程式設計
- 非同步程式設計---Promise非同步程式設計Promise
- js 非同步程式設計JS非同步程式設計
- 002 Rust 非同步程式設計,async await 簡單介紹Rust非同步程式設計AI
- 非同步程式設計 101:Python async await發展簡史非同步程式設計PythonAI
- Golang非同步程式設計方式和技巧Golang非同步程式設計
- Flutter非同步程式設計-async和awaitFlutter非同步程式設計AI
- JS非同步程式設計——深入理解async/awaitJS非同步程式設計AI
- 美女程式設計師觀點:程式設計師最重要的非程式設計技巧程式設計師
- [python] Python非同步程式設計庫asyncio使用指北Python非同步程式設計
- python非同步程式設計之asyncio初識Python非同步程式設計
- NIO非阻塞程式設計小案例程式設計
- 非科班程式設計師和科班程式設計師的差距到底在哪裡?程式設計師