python3 asyncio 包的使用

  • Post author:
  • Post category:python


使用asyncio 包进行并发

抨击线程的往往是系统程序员,他们考虑的使用场景对一般的应用程序员来说,也许

一生都不会遇到……应用程序员遇到的使用场景,99% 的情况下只需知道如何派生

一堆独立的线程,然后用队列收集结果

——Michele Simionato 深度思考 Python 的人

在别的博客中讲了使用concurrent.futures 模块处理并发, 里面也有将阻塞函数变为非阻塞函数。

这里使用asyncio 包来处理并发, 两个中都有期物, future的概念。 期物是基础。

相比较concurrent.futures 而言, asyncio 用于协程实现并发

协程替代多线程实现动画

import asyncio
import itertools
import sys


@asyncio.coroutine
def spin(msg):
    write, flush = sys.stdout.write, sys.stdout.flush
    for char in itertools.cycle('|/-\\'):
        status = char + ' ' + msg
        write(status)
        flush()
        write('\x08' * len(status))
        try:
            yield from asyncio.sleep(.1)
        except asyncio.CancelledError:
            break

    write(' ' * len(status) + '\x08' * len(status))


@asyncio.coroutine
def slow_function():
    # 假装等待I/O一段时间
    # yield from asyncio.sleep(3)
    yield from asyncio.sleep(3)  # 把控制权交给主循环,在休眠结束之后恢复这个协程
    return 5  # 协程中获取的值都是return 中的值


@asyncio.coroutine
def supervisor():
    # asyncio.async() 函数排定spin协程的运行时间, 使用一个task对象包装spin协程并立即返回
    spinner = asyncio.async(spin('thinking!'))
    print('spinner object:', spinner)
    result = yield from slow_function()
    spinner.cancel()
    return result


def main():
    loop = asyncio.get_event_loop()
    result = loop.run_until_complete(supervisor())
    loop.close()
    print('Answer:', result)


if __name__ == '__main__':
    main()

@asyncio.coroutine 这个装饰器不会预激协程。

线程函数

def supervisor():
    signal = Signal()
    spinner = threading.Thread(target=spin,
    args=('thinking!', signal))
    print('spinner object:', spinner)
    spinner.start()
    result = slow_function()
    signal.go = False
    spin



版权声明:本文为yangxiaodong88原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。