同步异步

同步异步

程序的运行状态:阻塞和非阻塞

处理任务的方式:并行,并发,串行

提交任务的方式:同步,异步

同步

指的是 提交任务后必须在原地等待 直到任务结束

异步

提交任务后不需要在原地等待 可以继续往下执行代码

异步效率高于同步 ,异步任务将导致一个问题 就是 任务的发起方不知道任务何时 处理完毕

解决方法:

​ 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')

posted @ 2019-07-14 15:43  wanjiang  阅读(172)  评论(0编辑  收藏  举报