通過下面這張圖你就能看清楚了,程序、線程和攜程的關系
程序:
多個程序是可以運作在多個CPU當中的,比如你的電腦是4核,可以同時并行運作四個程序,這是真正實體上的并行運作。
線程:
每個程序又可以有多個線程,線程是輪詢執行的,因為輪詢的速度很快,是以可以看成是并行。
微線程:
攜程是微線程,一個線程可以分為多個攜程,同樣也是輪詢執行,這樣的好處是減少CPU的資源消耗,一些比較多而且小的事件可以用攜程去處理,減少資源的開銷。
協程原理
生成器器
def fun1():
print(100)
print(200)
yield # 暫停代碼 儲存斷點狀态
print(100)
print(100)
yield
eventlet
print(100)
print(100)
def fun2():
print(100)
print(200)
yield
print(100)
print(100)
yield
print(100)
print(100)
gen_obj1 = fun1() # 建立了生成器器對象
gen_obj2 = fun2()
next(gen_obj1)
next(gen_obj2)
next(gen_obj1)
next(gen_obj2)
通常采用協程庫(擴充庫)來完成協程開發
協程庫能夠自動幫助完成協程的執行切換
eventlet
from multiprocessing import Process
p = Processs()
p.start()
from threading import Thread
t = Thread()
t.start()
from eventlet import Eventlet
e1 = Eventlet()
e1.start()
e2 = Eventlet()
e2.start()
協程運行socketio伺服器器的⽅方式
pip install eventlet
import eventlet
eventlet.monkey_patch()
import socketio
import eventlet.wsgi
# Server對象理理解為Flask⾥裡里⾯面的應⽤用對象就可以
# sio對象是⽤用來管理理socketio即時通訊業務的
sio = socketio.Server(async_mode='eventlet') #
指明在evenlet模式下
app = socketio.Middleware(sio)
eventlet.wsgi.server(eventlet.listen(('',
8000)), app)