zoukankan      html  css  js  c++  java
  • 同步异步

    同步异步

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

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

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

    同步

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

    异步

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

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

    解决方法:

    ​ 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')
    
    
  • 相关阅读:
    MySQL根据逗号将一行数据拆成多行数据
    pyhon实现excel的转置
    python批量加入数据库
    jieba词频统计
    python 求顾客相邻两次购买周期
    mysql求取最后两次价格上涨趋势
    mysql求每一个顾客购买商品的相邻时间间隔
    利用Python从一个数据库中查询结果插入到另一个数据库中
    电商项目数据分析
    线程的两种调用方式
  • 原文地址:https://www.cnblogs.com/bruce123/p/11184432.html
Copyright © 2011-2022 走看看