• 回调函数 协程


    # 什么是回调函数:
    # 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




















  • 相关阅读:
    关于C#中timer类 (转)
    AutoResetEvent (转)
    给韬哥的回复
    sql中的case when 的用法涉及到大于小于号
    vba中获取当前日期
    vba中的小技巧
    sql server2000中的两个整数相除保留十位小数
    vba中新建文件,关闭文件,锁屏,覆盖同名文件
    无法切换到google.com的解决办法
    mysql 常用命令
  • 原文地址:https://www.cnblogs.com/fanbiyong/p/10221212.html
Copyright © 2020-2023  润新知