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)
])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章