处理多任务线程和协程对比

线程版处理多任务:

#!/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'+'\n')

@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在协程中的作用:把控制权交给调度程序。然后就能很好的理解上面协程的运行方式

 



转载于:https://www.cnblogs.com/pyrene/p/7500291.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值