OpenStack協同併發 eventlet

2022-07-13 09:57:08 字數 1894 閱讀 2758

今天聽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

5634

程式很簡單,定義兩個協程,最後一行g1.switch()跳轉到 test1() ,它列印12,然後跳轉到 test2() ,列印56,然後跳轉回 test1() ,列印34,然後 test1() 就結束,gr1死掉,回到父greenlet,不會再切換到test2,所以不會列印78。在上面的例子中main greenlet就是它們的父greenlet。

greenlet使用雖然簡單,但是需要程式設計師顯式的寫**在不同的協程之間切換,對於openstack這樣的大專案顯然是不現實的。

於是eventlet封裝了greenlet,以下是eventlet的介紹:

python 2.x 原生是不支援協程的,eventlet通過對標準庫打patch實現協程,例如在nova專案中 nova/cmd/__init__.py

import

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)

其中eventlet.monkey_patch()就是對標準庫打patch。

在除錯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 ...