单线程实现并发——协程,gevent模块
一 并發的本質 ?
1 切換
2 保存狀態
二 協程的概念
協程,又稱微線程,纖程。英文名Coroutine。單線程下實現并發,用戶從應用程序級別控制單線程下任務的切換,注意一定是遇到I/O才切。
協程的特點在于是一個線程執行,那和多線程比,協程有何優勢?
最大的優勢就是協程極高的執行效率。因為子程序切換不是線程切換,而是由程序自身控制,因此,沒有線程切換的開銷,和多線程比,線程數量越多,協程的性能優勢就越明顯。
第二大優勢就是不需要多線程的鎖機制,因為只有一個線程,也不存在同時寫變量沖突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比多線程高很多。
因為協程是一個線程執行,那怎么利用多核CPU呢?最簡單的方法是多進程+協程,既充分利用多核,又充分發揮協程的高效率,可獲得極高的性能。
三 gevent模塊
gevent是一個基于協程的Python網絡庫。
需要導入猴子補丁。
方法:
g1=gevent.spawn(func,):提交任務。 ? 生成g1,是Greenlet類
gevent.sleep():睡
gevent.joinall(可迭代對象):阻塞,知道所有選中的任務執行完畢。
g1.join()?
g1.value 獲取由func函數生成Greenlet類的返回值。
import gevent from gevent import monkey;monkey.patch_all() from threading import current_thread import time def foo():print('%s is running ' % current_thread().getName())time.sleep(1)print('%s is done '%current_thread().getName()) def bar():print('%s is running ' % current_thread().getName())time.sleep(2)print('%s is done ' % current_thread().getName())g1=gevent.spawn(foo) g2=gevent.spawn(bar) print('g1',g1) print('g2',g2)# g1.join() # g2.join() gevent.joinall([g1,g2])輸出:
g2 <Greenlet at 0x26d7aff0898: bar> DummyThread-1 is running DummyThread-2 is running DummyThread-1 is done DummyThread-2 is done?
轉載于:https://www.cnblogs.com/654321cc/p/7681157.html
總結
以上是生活随笔為你收集整理的单线程实现并发——协程,gevent模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序开发之https从无到有
- 下一篇: 调集群,我的姿势不对,好累!