同步异步
程序的运行状态:阻塞和非阻塞
处理任务的方式:并行,并发,串行
提交任务的方式:同步,异步
同步
指的是 提交任务后必须在原地等待 直到任务结束
异步
提交任务后不需要在原地等待 可以继续往下执行代码
异步效率高于同步 ,异步任务将导致一个问题 就是 任务的发起方不知道任务何时 处理完毕
解决方法:
1.轮询 重复的隔一段时间就问一次
效率低 无法及时获取结果 不推荐
2.让任务的执行方主动通知 (异步回调)
可以及时拿到任务的结果 推荐方式
异步调用案例:
#线程异步回调
from threading import Thread
def task(callback):
print('run')
# time.sleep(5)
for i in range(100000000):
1+1
callback('ok')
def finish(res):
print('任务完成',res)
print('start')
t = Thread(target=task,args=(finish,))
t.start()
print('over')
使用案例:
#线程池以异步提交任务方式
from concurrent.futures import ThreadPoolExecutor
import time
def task():
time.sleep(3)
print('son thread run')
return 'ok'
def callback(arg):
print('任务执行完成',arg)
print('任务结果:',arg.result())
#创建线程池
pool = ThreadPoolExecutor(2)
res = pool.submit(task) #异步提交方式
# print(res) #<Future at 0x2dc4c605630 state=running>
# print(res.result()) #但是result是个阻塞函数,直到子线程任务结束
res.add_done_callback(callback) #绑定回调函数,线程池调用回调函数时,默认附加个参数
print('main thread')
#线程池具体使用
from concurrent.futures import ThreadPoolExecutor
import time
#定义任务函数
def task(num):
time.sleep(1)
print(num)
return 'hello world'
#定义回调函数
def callback(obj):
print(obj.result())
#创建线程池
pool = ThreadPoolExecutor(2)
#submit提交任务
res = pool.submit(task,123) #对task传参123作为num
#绑定回调函数
res.add_done_callback(callback)
print('over')