阻塞与非阻塞是用来描述程序的状态python
阻塞:指调用结果返回以前,当前线程会被挂起(如遇到IO操做),函数只有在获得结果以后才会将阻塞的线程激活多线程
非阻塞:指不能马上获得返回结果以前也会马上返回,同时不会阻塞当前线程并发
串行、并发与并行是用来描述处理任务的方式异步
串行:程序按照自上而下的顺序执行函数
并发:多个任务同时执行,本质上是在不一样进程或线程间切换执行,因为速度快因此感受是同时运行spa
并行:真正意义上的多个任务同时执行线程
同步与异步是指提交任务的方式code
同步:指的是提交任务后必须在原地等待,直到任务结束。此时任务仍是激活的状态,因此并非阻塞进程
异步:指的是提交任务后不须要在原地等待,能够继续往下执行代码。例如开启多线程多进程能够实现异步,会产生阻塞ip
异步效率会高于同步效率,但异步任务将致使一个问题:任务的发起方不知道任务什么时候结束。因此有如下两种解决方法:
方法一:重复的隔一段时间就询问一次。效率低,而且没法及时获取结果,因此不推荐使用
方法二:让任务的执行方主动通知(异步回调)。能够及时拿到任务的结果,推荐使用
# 线程中异步回调 import time from threading import Thread def task(callback): print('task start....') sum = 0 for i in range(10000): sum += i time.sleep(2) callback(sum) # 回调函数,参数为任务的结果 def callback(res): print('task result:', res) t = Thread(target=task, args=(callback,)) t.start() print('over') -------------------------------------------------------------------------------------- # 进程异步回调 import time from multiprocessing import Process def task(callback): print('task start....') sum = 0 for i in range(10000): sum += i time.sleep(2) callback(sum) def callback(res): print('task result:', res) if __name__ == '__main__': p = Process(target=task,args=(callback,)) p.start() print('over')
# 线程池异步回调 import time from concurrent.futures import ThreadPoolExecutor def task(num): print('task starting...') sum = 0 for i in range(1000): sum += i time.sleep(2) print(num) return sum def callback(obj): print('task end:', obj.result()) pool = ThreadPoolExecutor(2) res = pool.submit(task, 123) res.add_done_callback(callback) 为任务绑定回调函数 print('over') -------------------------------------------------------------------------------------- # 进程池异步回调 import time from concurrent.futures import ProcessPoolExecutor def task(): print('task start....') time.sleep(2) print('task end') return 'hello python' def callback(res): print('任务结果:', res.result()) if __name__ == '__main__': p = ProcessPoolExecutor(2) res = p.submit(task) res.add_done_callback(callback) # 为任务绑定回调函数 print('over') # 补充知识: # res: <Future at 0x21d2230a9b0 state=running> # res.result: <bound method Future.result of <Future at 0x21d2230a9b0 state=running>> # res.result(): hello python