zoukankan      html  css  js  c++  java
  • 利用asyncio(支持异步io)和协程实现单线程同步

    首先,协程实现可以通过send(None)启动,send(n)调用,close()关闭。

    def consumer():
      r = ''
      while True:
        n = yield r
        if not n:
          return
        print('[CONSUMER] Consuming %s...' % n)
        r = '200 OK'
    def produce(c):
      c.send(None)
      n = 0
      while n < 5:
        n = n + 1
        print('[PRODUCER] Producing %s...' % n)
        r = c.send(n)
        print('[PRODUCER] Consumer return: %s' % r)
      c.close()
    c = consumer()
    produce(c)

    asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程
    扔到EventLoop中执行,就实现了异步IO。

    import asyncio
    @asyncio.coroutine
    def hello():
      print("Hello world!")
      # 异步调用asyncio.sleep(1):
      r = yield from asyncio.sleep(1)
      print("Hello again!")
    # 获取EventLoop:
    loop = asyncio.get_event_loop()
    # 执行coroutine
    loop.run_until_complete(hello())
    loop.close()

    @asyncio.coroutine把一个generator标记为coroutine类型,然后,我们就把这个coroutine扔到EventLoop中执行。
    hello()会首先打印出Hello world!,然后,yield from语法可以让我们方便地调用另一个generator。由
    于asyncio.sleep()也是一个coroutine,所以线程不会等待asyncio.sleep(),而是直接中断并执行下一个消息循环。
    当asyncio.sleep()返回时,线程就可以从yield from拿到返回值(此处是None),然后接着执行下一行语句。
    把asyncio.sleep(1)看成是一个耗时1秒的IO操作,在此期间,主线程并未等待,而是去执行EventLoop中其他可以执
    行的coroutine了,因此可以实现并发执行。

  • 相关阅读:
    面试生信工程师2
    R语言矩阵相关性计算及其可视化?
    PCA方差解释比例求解与绘图?
    MySQL 练习
    oracle高级数据查询技术
    Oracle安全管理
    基本查询语句
    管理表
    oracle PL/SQL高级编程
    oracle视图与索引
  • 原文地址:https://www.cnblogs.com/dynas/p/6813206.html
Copyright © 2011-2022 走看看