今天聽easystack一哥們講nova協同併發,結合自己之前的認識。回顧一下openstack eventlet。
openstack作為熱門的開源雲平台,本身**當然得支援高併發。
首先講講python的併發,python中的併發有:程序、執行緒、協程(coroutines)。
程序、執行緒、協程之間的關係可以用下圖表示:
eventlet是對greenlet的封裝,先了解下greenlet,下面是乙個官方給出的例子:
1執行結果是:from greenlet import
greenlet23
deftest1():
4print 12
5gr2.switch()
6print 3478
deftest2():
9print 56
10gr1.switch()
11print 78
1213 gr1 =greenlet(test1)
14 gr2 =greenlet(test2)
15 gr1.switch()
12程式很簡單,定義兩個協程,最後一行g1.switch()跳轉到 test1() ,它列印12,然後跳轉到 test2() ,列印56,然後跳轉回 test1() ,列印34,然後 test1() 就結束,gr1死掉,回到父greenlet,不會再切換到test2,所以不會列印78。在上面的例子中main greenlet就是它們的父greenlet。5634
greenlet使用雖然簡單,但是需要程式設計師顯式的寫**在不同的協程之間切換,對於openstack這樣的大專案顯然是不現實的。
於是eventlet封裝了greenlet,以下是eventlet的介紹:
python 2.x 原生是不支援協程的,eventlet通過對標準庫打patch實現協程,例如在nova專案中 nova/cmd/__init__.py
import其中eventlet.monkey_patch()就是對標準庫打patch。eventlet
from nova import
debugger
ifdebugger.enabled():
#turn off thread patching to enable the remote debugger
eventlet.monkey_patch(os=false, thread=false)
else
: eventlet.monkey_patch(os=false)
在除錯nova**時,有時會因為協程導致除錯不方便,可以把else語句裡面的eventlet.monkey_patch(os=false)改為eventlet.monkey_patch(os=false, thread=false)
在eventlet的文件中有關於eventlet的使用,主要包含以下幾個介面:
(1) spawn(func, *args, **kw)
啟動乙個greenthread來呼叫func函式,args和kw都是傳遞給func的引數。返回值是greenthread.greenthread物件
(2) spawn_n(func, *args, **kw)
除了沒有返回值,其他跟spawn一樣
(3) spawn_after(seconds, func, *args, **kw)
在seconds秒之後啟動
(4) sleep(seconds=0)
暫停當前greenthread,給其它greenthread執行的機會
參加資料:
獲得token並執行OpenStack的API
搭建起一套openstack的環境之後,若要執行指定的api怎麼做?openstack各個元件 專案也都是基於web service的,因此一樣用curl發http請求即可。原理都是一樣。首先,通過提供租戶 使用者名稱和密碼,獲得認證用的token和指定api所在專案的url 然後利用此token和...
Openstack 解除安裝
1 查詢以前是否裝有mysql 命令 rpm qa grep i mysql 可以看到mysql的兩個包 mysql 4.1.12 3.rhel4.1 mysqlclient10 3.23.58 4.rhel4.1 2 刪除mysql 刪除命令 rpm e nodeps 包名 rpm ev mysq...
openstack清空網路
may 18th,2013 comments 清空 quantum 資料 for i in quantum floatingip list grep v grep v id awk do quantum floatingip delete i donefor i in quantum router ...