线程和asyncio的比较

Posted liuer-mihou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程和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()

 主要是两者的supervisor方法对比:

1.asyncio.Task对象差不多与threading.Thread对象等效。

2.Tas对象用于驱动协程,Thread对象用于调用可调用的对象

3.Task对象不用自己手动创建,而是通过把携程穿过asyncio.async(...)函数或loop.create_task(...)方法获取

4.获取的Task对象已经排定了运行时间(例如,有asyncio.async函数排定);Thread实例必须调用start方法,明确告知让他运行。

5.线程版supervisor函数中,slow_func是普通函数,直接有线程调用。

   异步版supervisor函数中,slow_func是协程,有yield from驱动。

6.没有API能从外部终止线程,因为线程随时可能被中断,导致系统处于无效状态。如果想终止任务,可以使用Task.cancel()实例方法,在协程内部抛出CanceledError异常。协程可以在暂停的yield处捕获这个异常,处理终止请求。

7.supervisor协程必须在main函数中由loop.run_until_complete方法执行。

以上是关于线程和asyncio的比较的主要内容,如果未能解决你的问题,请参考以下文章

通过简单示例了解 AsyncIO 和线程顺序

流畅python学习笔记第十八章:使用asyncio包处理并发

python 多进程和多线程3 —— asyncio - 异步IO

python 多进程和多线程3 —— asyncio - 异步IO

asyncio:异步I/O事件循环和并发工具(持续跟新中)

等效于带有工作“线程”的 asyncio.Queues