zoukankan      html  css  js  c++  java
  • 回调函数 协程

    # 什么是回调函数:
    # a交给b一个任务 b在执行完成后回过头调用了a的一个函数 就称之为回调
    # 为什么需要回调函数:
    # 需要获取异步任务的结果,但是又不应该阻塞(降低效率)
    # 高效率的获取任务结果
    # 通常异步任务都会和回调函数一起使用
    # 通过给future对象绑定一个函数 add_done_callback()
    #
    #
    # obj.add_done_callback(参数函数名)
    # 注意:在多进程中回调函数是交给住进程来执行而在多线程中 回调函数是谁有空谁执行(不是主线程)

    队列:
    # 队列:
    # from queue import Queue,LifoQueue,PriorityQueue
    #
    # # Queue 队列 先进先出
    # # LifoQueue 堆栈 后进先出
    # # PriorityQueue 优先级队列 取出顺序是 小的优先级先取出来
    # # 优先级可以使用数据或者字符
    # pq =PriorityQueue()
    # pq.put((1,'a'))
    # pq.put((2,'b'))
    # print(pq.get())

     事件: 就是一个通知
    # 是用于协调多个线程工作的,当一个线程要执行某个操作,需要获取另外一个线程的状态

    # from threading import Event,Thread
    # import time
    # e = Event() #默认False
    # def start():
    # print('正在启动服务器')
    # time.sleep(5)
    # print('服务器启动成功')
    # e.set() # 把时间的值设置为Ture
    # def connect():
    # print('等待服务器启动...')
    # e.wait() #会阻塞 直到对方把事件设置为Ture
    # if e.isSet():
    # print('连接成功!')
    # Thread(target=start).start()
    # Thread(target=connect).start()
    #
    #
    # def connect():
    # #客户端尝试3次连接服务器 3次不成功后放弃每次等待1s
    # for i in range(3):
    # print('等待服务器启动...')
    # e.wait(1) #会阻塞 直到对方把事件设置为Ture
    # if e.isSet():
    # print('连接成功!')
    # break
    # else:
    # print('连接失败')
    # else:
    # print('服务器没有启动')
    
    
        greenlet 主要封装了生成器 是的我们在使用生成器实现并发时 简化了代码
    
    """
    
    import greenlet
    import time
    
    def task1():
        print("task1 run")
        time.sleep(10)
        g2.switch()
        print("task1 run")
    
    def task2():
        print("task2 run")
        g1.switch()
    
    g1 = greenlet.greenlet(task1)
    g2 = greenlet.greenlet(task2)
    g1.switch()
    协程:
    可以这么理解是协助线程更高效的工作
    本质就是单线程现实并发
    也称之为微线程(它比线程更轻量级 单线程下任务的切换比操作系统切换线程要简单 的多)
    from gevent import monkey
    monkey.patch_all()
    import gevent
    import time

    def task3():
    print('task3 run')
    time.sleep(3)
    print('task3 run')

    def task4():
    print('task4 run')
    time.sleep(3)
    print('task3 run')
    g1 = gevent.spawn(task3)
    g2 = gevent.spawn(task4)
    异步提交任务 不考虑是否执行完,直接运行下去直接结束

    # gevent.joinall([g1,g2]) #等待所有任务结束
    # 如果开启了一个会产生的io操作 如果没有join 当其他任务结束时这个任务会立即结束不会等待结束,所以要确保给每个任务都添加到join




















  • 相关阅读:
    win10笔记本实现双屏显示的自如切换
    word-如何将文字设置为插入超链接
    opencv-python教程学习系列13-图像平滑
    第12课 经典问题解析一
    第11课 新型的类型转换
    第10课 C++中的新成员
    第9课 函数重载分析(下)
    第8课 函数重载分析(上)
    第7课 函数参数的扩展
    第6课 内联函数分析
  • 原文地址:https://www.cnblogs.com/fanbiyong/p/10221212.html
Copyright © 2011-2022 走看看