简单理解异步编程(python)和异步编程(nodejs)

同步编程

同一时间只能做一件事。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
原文地址:https://www.cnblogs.com/ghgxj/p/14219098.html