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