• gevent模块学习(一)


    1.Event类,事件主要用于Greenlet之间的异步通信
    e = gevent.event.Event() -> Event
    说明: 创建一个信号对象
    e.set() -> None
    说明: 设置标志位
    e.clear() -> None
    说明: 清除标志位
    e.wait() -> None
    说明: 阻塞直至标志位被设置
     
    扩展:
    a = gevent.event.AsyncResult() -> AsyncResult
    说明: 创建一个扩展可携带数据的信号对象
    a.set(value=None) -> None
    说明: 设置带数据的标志位
    a.e.clear() -> None
    说明: 清除带数据的标志位
    a.get(block=True, timeout=None) -> obj
    说明: 阻塞直至标志位被设置并返回value值,可设置timeout到点抛出Timeout异常
    #coding:utf-8
    
    # 1 事件 event
    # 是一个在Greenlet之间异步通信的形式
    import gevent
    from gevent.event import Event
    
    evt = Event()
    
    # evt.set() 设置flag
    # evt.clear() 清除
    # evt.wait()  阻塞等待
    
    def setter():
        print('wait for ')
        evt.rawlink(event_callback)  # 注册一个回调
        gevent.sleep(3)
        print('ok done')
        evt.set()
    
    
    def waiter():
        print('will wait for u')
        evt.wait()
        print('about time')
    
    
    def event_callback(evt):
        print('callback')
    
    
    def main():
        gevent.joinall([
            gevent.spawn(setter),
            gevent.spawn(waiter),
            gevent.spawn(waiter),
            gevent.spawn(waiter),
            gevent.spawn(waiter),
            gevent.spawn(waiter),
        ])
    
    
    if __name__ == "__main__":
        main()
    
    # coding:utf-8
    
    import gevent
    
    import time
    from gevent import event  # 调用gevent的event子模块
    
    
    # 三个进程需要定义三个事件event1,event2,event3,来进行12,23,31循环机制,即进程一,进程二,进程三顺序执行
    
    def fun1(num, event1, event2):  # 固定格式
    
        i = 0
    
        while i < 10:  # 设置循环10次
    
            i += 1
    
            time.sleep(1)  # 睡眠1秒
    
            print'进程一:111111111'
    
            event2.set()  # 将event2值设为True
    
            event1.clear()  # 将event1值设为False
    
            event1.wait()  # event1等待,其值为True时才执行
    
    
    def fun2(num, event2, event3):
        i = 0
    
        while i < 10:
            i += 1
    
            time.sleep(1)
    
            print'进程二:222222222'
    
            event3.set()  # 将event3值设为True
    
            event2.clear()  # 将event2值设为False
    
            event2.wait()  # event2等待,其值为True时才执行
    
    
    def fun3(num, event3, event1):
        i = 0
    
        while i < 10:
            i += 1
    
            time.sleep(1)
    
            print'进程三:333333333'
    
            event1.set()  # 将event1的值设为True
    
            event3.clear()  # 将event3的值设为False
    
            event3.wait() # event3 等待,值为True时才执行
    
    
    if __name__ == "__main__":  # 执行调用格式
    
        act1 = gevent.event.Event()  # 调用event中的Event类,用act1表示
    
        act2 = gevent.event.Event()
    
        act3 = gevent.event.Event()
    
        # 三个进程,act1,act2,act3
    
        Gevents = []  # 建立一个数列,用来存和管理进程
    
        g = gevent.Greenlet(fun1, 1, act1, act2)  # 调用gevent中的Greenlet子模块,用Greenlet创建进程一
    
        g.start()
    
        print'进程一启动:'
    
        Gevents.append(g)  # 将进程一加入到Gevents数列
        g = gevent.Greenlet(fun2, 2, act2, act3)
    
        g.start()
    
        print'进程二启动:'
    
        Gevents.append(g)
        g = gevent.Greenlet(fun3, 3, act3, act1)
    
        g.start()
    
        print'进程三启动:'
    
        print'所有进程都已启动!'
    
        Gevents.append(g)
        gevent.joinall(Gevents)  # 调用Greenlet中的joinall函数,将Gevents的进程收集排列
    
    # coding:utf-8
    # AsyncResult 允许你在唤醒调用上附加一个值,有时也被称作future或defered 因为它持有一个指向将来任意时间可设置为任何值的引用
    
    import gevent
    from gevent.event import AsyncResult
    a = AsyncResult()
    
    # a.set(value=None)
    # a.clear()
    # a.get(block=True, timeout=None) 阻塞直至标志位被设置并返回value值, 可设置timeout
    
    def setter():
        gevent.sleep(2)
        a.set('aaaa')
    
    
    def waiter():
        print(a.get(timeout=5))
    
    gevent.joinall([
        gevent.spawn(setter),
        gevent.spawn(waiter)
     ])
    
  • 相关阅读:
    集合 Subset Sums
    resin config 中文(resin.xml)
    resin4 简单学习
    什么是敏捷软件测试
    10个热门IT证书
    LoadRunner监控Linux服务器
    Agile 敏捷开发
    戴明PDCA方法
    【转】什么是内存泄露? 内存泄露检测工具
    LoadRunner常见问题
  • 原文地址:https://www.cnblogs.com/kidl/p/9699284.html
Copyright © 2020-2023  润新知