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

原文地址:https://www.cnblogs.com/dynas/p/6813206.html