zoukankan      html  css  js  c++  java
  • 处理多任务线程和协程对比

    线程版处理多任务:

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import threading
    import itertools
    import time
    import sys
    
    
    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))
            time.sleep(1)
            if not signal.go:
                break
        write(' '* len(status) + 'x08'*len(status))
    
    def slow_function():
        time.sleep(3)
        return 42
    
    def supervisor():
        signal=Signal()
        spinner=threading.Thread(target=spin,args=('thinking!',signal))
        print('spinner object:',spinner)
        spinner.start()
        result=slow_function()
        signal.go=False
        spinner.join()
        return result
    
    def main():
        result=supervisor()
        print('Answer:',result)
    
    if __name__=='__main__':
        main()

    线程这里注意:一定要把主线程进行阻塞,通过释放GIL才能创建另一个线程,执行多任务

    协程版处理多任务

    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(' hello'+'
    ')
    
    @asyncio.coroutine
    def slow_function():
        yield from asyncio.sleep(3)
        return 42
    
    @asyncio.coroutine
    def supervisor():
        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()

    协程通过创建绿程,和yield from方式执行多任务。同一时间只有一个协程  这里的

    @asyncio.coroutine 可加可不加,最好加上。只是用来声明这是一个协程

    上面两个结果如下:

    旋转的指针thinking,三秒过后42

    注意点:

    关于协程,国人网上资料错误真是错误百出,看着各种解释,不好意思,忍不住笑出声。解释错误,一传十十传百,唉,心痛,这也就是中国开源事业起不来的重要原因之一

    特别是yield from的解释,基本国人网上都是错误的

    yield from 作用:

    yield from在协程中的作用:把控制权交给调度程序。然后就能很好的理解上面协程的运行方式



  • 相关阅读:
    人工智能系统
    Maven tomcat插件配置和使用
    青春谁不糊涂3
    假设但是学习java入门,请离开SSH稍远
    Linux下top订购具体解释
    Unity3d + NGUI 多分辨率适应
    Delphi 注册文件类型 设置文件图标
    如何创建自定义的文件类型关联
    delphi 中字符串与16进制、10进制转换函数
    十六进制字符串转化成字符串输出HexToStr(Delphi版、C#版)
  • 原文地址:https://www.cnblogs.com/pyrene/p/7500291.html
Copyright © 2011-2022 走看看