Flask框架(七)--效率

flask效率

flask默认支持多线程的服务器操作

pyhton中提高性能的方式:

进程

  • fork
  • process
  • multiprocessing

线程

  • thread
  • threading

协程

python的一种提升效率的手段,消耗小,由人为控制切换,利用线程执行中的耗时操作时间,去做别的事情。

  • 实际上协程就是使用yield进行封装的。
  • 使用greenlet封装了yield
  • gevent封装了greenlet

协程

yield

# 并发执行
import time
def work1():
    while True:
        print('work1')
        yield 1
        time.sleep(1)
def work2():
    while True:
        print('work2')
        yield 1
        time.sleep(3)

def main():
    w1 = work1()
    w2 = work2()
    while True:
        next(w1)
        next(w2)

if __name__ == '__main__':
    main()

greenlet

Python可以使用yield快速生成协程,但是不稳定,因此封装了yield为greenlet,使得切换任务变得更加简单

from greenlet import greenlet
import time

def work1():
    while True:
        print('work1')
        w2.switch()
        time.sleep(1)

def work2():
    while True:
        print('work2')
        w1.switch()
        time.sleep(3)

if __name__ == '__main__':
    w1 = greenlet(work1)
    w2 = greenlet(work2)
    w1.switch()

但依然需要手动进行任务切换,所以出现了gevent

gevent封装了greenlet

gevent–网络异步的并发库

import gevent
import time
def work1(num):
    for i in range(num):
        print(i)
        # time.sleep(1)    # 这里不认time.sleep()
        # 也不认IO密集
        gevent.sleep(1)

def work2():
    for i in range(10):
        print(i)
        gevent.sleep(1)

w1 = gevent.spawn(work1,10)    # 创建一个gevent对象(参数:要执行的方法)
w2 = gevent.spawn(work2)

w1.join()    # 等待w1执行结束
w2.join()    # 等待w2执行结束

为了使IO等耗时操作生效

使用补丁:猴子补丁

在这里插入图片描述

import gevent
from gevent import monkey
monkey.patch_all()   ## 识别耗时操作,并转化
import time
def work1(num):
    for i in range(num):
        print(i)
        time.sleep(1)

def work2():
    for i in range(10):
        print(i)
        time.sleep(1)

gevent.joinall([
	gevent.spawn(work1,10),
	gevent.spawn(work2)
])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值