使用python做web開發面臨的乙個最大的問題就是效能,在解決c10k問題上顯的有點吃力。有些非同步框架tornado、twisted、gevent 等就是為了解決效能問題。這些框架在效能上有些提公升,但是也出現了各種古怪的問題難以解決。
在python3.6中,官方的非同步協程庫asyncio正式成為標準。在保留便捷性的同時對效能有了很大的提公升,已經出現許多的非同步框架使用asyncio。
使用較早的非同步框架是aiohttp,它提供了server端和client端,對asyncio做了很好的封裝。但是開發方式和最流行的微框架flask不同,flask開發簡單,輕量,高效。正是結合這些優點, 以sanic為基礎,整合多個流行的庫來搭建微服務。 sanic框架是和flask相似的非同步協程框架,簡單輕量,並且效能很高。本專案就是以sanic為基礎搭建的python微服務框架。(思想適用於其他語言)
微服務設計原則個人總結:
微服務總體架構:
使用sanic非同步框架,有較高的效能,但是使用不當會造成blocking, 對於有io請求的都要選用非同步庫。新增庫要慎重。sanic使用uvloop非同步驅動,uvloop基於libuv使用cython編寫,效能比nodejs還要高。功能說明:
啟動前
queue = asyncio.queue()
reporter = aioreporter(queue=queue)
tracer = basictracer(recorder=reporter)
tracer.register_required_propagators()
opentracing.tracer = tracer
中介軟體
異常處理
對丟擲的異常進行處理,返回統一格式
任務
建立task消費queue中對span,用於日誌追蹤
非同步處理
由於使用的是非同步框架,可以將一些io請求並行處理
example:
asyncdefasync_request(datas):
# async handler request
results =awaitasyncio.gather(*[data[2]fordataindatas])
forindex, objinenumerate(results):
data = datas[index]
data[0][data[1]] = results[index]
@user_bp.get('/')@doc.summary("get user info")@doc.description("get user info by id")@doc.produces(users)asyncdefget_users_list(request, id):
asyncrecord =awaitcur.fetch(
""" select * from users where id = $1
python中 python中的 與
這一部分首先要理解python記憶體機制,python中萬物皆物件。對於不可變物件,改變了原來的值,其別名 變數名 繫結到了新值上面,id肯定會改變 對於可變物件,操作改變了值,id肯定會變,而 是本地操作,其值原地修改 對於 號操作,可變物件和不可變物件呼叫的都是 add 操作 對於 號操作,可變...
python中否定for 在python中否定函式
有沒有一種方法可以否定乙個函式,使它返回負數。在我的函式中,我有條件句,每個條件句都讓這個 烏龜 移動。有沒有一種方法可以否定這一點,所以烏龜的每乙個動作都是否定的。我說的是 狀況 在def ttinterpret program interpret program as a tinyturtle ...
python中雙重迴圈 加速Python中的雙迴圈
有沒有辦法加快從上一次迭代更新其值的雙迴圈?在 中 def calc n,m x 1.0 y 2.0 container np.zeros n,2 for i in range n for j in range m x np.random.gamma 3,1.0 y y 4 y np.random....