• 利用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了,因此可以实现并发执行。

  • 相关阅读:
    【转】HEIF图片存储格式探秘
    【转】Maven项目中将配置文件打包到jar包中
    C++ 单词接龙
    vector vector int 初始化
    哈夫曼树的特点
    哈夫曼树的构造
    单链表的逆转(测试数据)
    单链表的逆转
    二叉搜索树的插入
    二叉搜索数的应用
  • 原文地址:https://www.cnblogs.com/dynas/p/6813206.html
Copyright © 2020-2023  润新知