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)
])