• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
唯允
博客园    首页    新随笔    联系   管理    订阅  订阅
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)
 ])

 

posted on 2018-09-25 14:26  唯允  阅读(1270)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3