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)
 ])

 

转载于:https://www.cnblogs.com/kidl/p/9699284.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值