线程和asyncio的比较

时间:2019-11-27
本文章向大家介绍线程和asyncio的比较,主要包括线程和asyncio的比较使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

本文借助动态转圈圈的例子展示

import sys
import itertools
import time
import threading


class Signal:
    go = True


def spin(msg, signal):
    write, flush = sys.stdout.write, sys.stdout.flush
    for char in itertools.cycle('|\-//'):
        status = char + ' ' + msg
        write(status)
        flush()
        write('\x08' * len(status))
        if not signal.go:
            break
    write('\x08' * len(status))


def slow_func():
    time.sleep(3)
    return 42


def supervisor():
    signal = Signal()
    spinner = threading.Thread(target=spin, args=('hahaha', signal))
    print('spin obj:', spinner)
    spinner.start()
    result = slow_func()
    signal.go = False  # 结束一个线程
    spinner.join()
    return result


def main():
    result = supervisor()
    print('Answer:', result)


if __name__ == '__main__':
    main()
import sys
import asyncio
import itertools


@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 as e:
            break


@asyncio.coroutine
def slow_func():
    yield from asyncio.sleep(3)
    return 42

@asyncio.coroutine
def supervisor():
    spinner = asyncio.Task(spin('hahaha'))
    print('spin obj:', spinner)
    result = yield from slow_func()
    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()

原文地址:https://www.cnblogs.com/liuer-mihou/p/11940224.html