协程 和 线程、函数调用的本质区别

28 篇文章 1 订阅
20 篇文章 0 订阅

协程和函数调用有什么区别:
函数调用是顺序执行的,如果调用2次,每次 sleep 10 秒,则总共休息20秒;
如果用协程,调用2次,每次休息 10秒,则总共 10 秒就完成了。
所有的协程分享进程的时间片,每个时间点只能有一个协程在执行代码。

如果正在执行的某个协程发生 IO 阻塞,则会把其换出,从而去执行其他 IO 就绪的协程。相当于说“利用 IO 阻塞等待的时间去执行其他 IO 就绪的协程,整个过程是自动切换的。

# -*- coding: utf-8 -*-
import datetime
import time
from gevent import monkey; monkey.patch_all()
import gevent

def f(tmp_list):
    tmp_list.append(1)
    time.sleep(10)

mylist = list()
def hello():
    # 从总体的执行时间和变量 mylist 的值,来理解协程和函数调用的区别
    print datetime.datetime.now()
    gevent.joinall([
            gevent.spawn(f, mylist),
            gevent.spawn(f, mylist),
    ])
    print 'mylist = {0}'.format(mylist)
    print datetime.datetime.now()

if __name__ == '__main__':
    hello()

The output of the demo:
2020-04-29 16:15:44.287000
mylist = [1, 1]
2020-04-29 16:15:54.288000

多线程比,协程有何优势?
最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值