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

  • 相关阅读:
    Oracle 增加修改删除字段
    asp.net,简单权限。存取读XML
    点击按钮出现60秒禁用倒计时js代码
    vb.net 接口POST方式传参数提交返回值
    给VS2005 2008等添加代码对照线,对齐线
    sql 、linq、lambda 查询语句的区别
    C# asp.net 实现导出Excel
    SQL中使用update inner join和delete inner join
    导入EXCEL表时,提示"找不到可安装的ISAM"怎么办
    ASP.NET后台通过输出JavaScript弹出窗口小结 弹窗弹框
  • 原文地址:https://www.cnblogs.com/dynas/p/6813206.html
Copyright © 2020-2023  润新知