国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python greenlet實(shí)現(xiàn)原理和使用示例

2020-02-23 05:50:59
字體:
供稿:網(wǎng)友

最近開始研究Python的并行開發(fā)技術(shù),包括多線程,多進(jìn)程,協(xié)程等。逐步整理了網(wǎng)上的一些資料,今天整理了一下greenlet相關(guān)的資料。

并發(fā)處理的技術(shù)背景

并行化處理目前很受重視, 因?yàn)樵诤芏鄷r(shí)候,并行計(jì)算能大大的提高系統(tǒng)吞吐量,尤其在現(xiàn)在多核多處理器的時(shí)代, 所以像lisp這種古老的語言又被人們重新拿了起來, 函數(shù)式編程也越來越流行。 介紹一個(gè)python的并行處理的一個(gè)庫: greenlet。 python 有一個(gè)非常有名的庫叫做 stackless ,用來做并發(fā)處理, 主要是弄了個(gè)叫做tasklet的微線程的東西, 而greenlet 跟stackless的最大區(qū)別是, 他很輕量級(jí)?不夠, 最大的區(qū)別是greenlet需要你自己來處理線程切換, 就是說,你需要自己指定現(xiàn)在執(zhí)行哪個(gè)greenlet再執(zhí)行哪個(gè)greenlet。

greenlet的實(shí)現(xiàn)機(jī)制

以前使用python開發(fā)web程序,一直使用的是fastcgi模式.然后每個(gè)進(jìn)程中啟動(dòng)多個(gè)線程來進(jìn)行請(qǐng)求處理.這里有一個(gè)問題就是需要保證每個(gè)請(qǐng)求響應(yīng)時(shí)間都要特別短,不然只要多請(qǐng)求幾次慢的就會(huì)讓服務(wù)器拒絕服務(wù),因?yàn)闆]有線程能夠響應(yīng)請(qǐng)求了.平時(shí)我們的服務(wù)上線都會(huì)進(jìn)行性能測(cè)試的,所以正常情況沒有太大問題.但是不可能所有場(chǎng)景都測(cè)試到.一旦出現(xiàn)就會(huì)讓用戶等好久沒有響應(yīng).部分不可用導(dǎo)致全部不可用.后來轉(zhuǎn)換到了coroutine,python 下的greenlet.所以對(duì)它的實(shí)現(xiàn)機(jī)制做了一個(gè)簡(jiǎn)單的了解.

每個(gè)greenlet都只是heap中的一個(gè)python object(PyGreenlet).所以對(duì)于一個(gè)進(jìn)程你創(chuàng)建百萬甚至千萬個(gè)greenlet都沒有問題.

代碼如下:
typedef struct _greenlet {
 PyObject_HEAD
 char* stack_start;
 char* stack_stop;
 char* stack_copy;
 intptr_t stack_saved;
 struct _greenlet* stack_prev;
 struct _greenlet* parent;
 PyObject* run_info;
 struct _frame* top_frame;
 int recursion_depth;
 PyObject* weakreflist;
 PyObject* exc_type;
 PyObject* exc_value;
 PyObject* exc_traceback;
 PyObject* dict;
} PyGreenlet;

每一個(gè)greenlet其實(shí)就是一個(gè)函數(shù),以及保存這個(gè)函數(shù)執(zhí)行時(shí)的上下文.對(duì)于函數(shù)來說上下文也就是其stack..同一個(gè)進(jìn)程的所有的greenlets共用一個(gè)共同的操作系統(tǒng)分配的用戶棧.所以同一時(shí)刻只能有棧數(shù)據(jù)不沖突的greenlet使用這個(gè)全局的棧.greenlet是通過stack_stop,stack_start來保存其stack的棧底和棧頂?shù)?如果出現(xiàn)將要執(zhí)行的greenlet的stack_stop和目前棧中的greenlet重疊的情況,就要把這些重疊的greenlet的棧中數(shù)據(jù)臨時(shí)保存到heap中.保存的位置通過stack_copy和stack_saved來記錄,以便恢復(fù)的時(shí)候從heap中拷貝回棧中stack_stop和stack_start的位置.不然就會(huì)出現(xiàn)其棧數(shù)據(jù)會(huì)被破壞的情況.所以應(yīng)用程序創(chuàng)建的這些greenlet就是通過不斷的拷貝數(shù)據(jù)到heap中或者從heap中拷貝到棧中來實(shí)現(xiàn)并發(fā)的.對(duì)于io型的應(yīng)用程序使用coroutine真的非常舒服.

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 娱乐| 且末县| 墨竹工卡县| 遂宁市| 阳山县| 鹤峰县| 桑植县| 丁青县| 松江区| 锡林郭勒盟| 巴东县| 灵宝市| 新竹市| 新营市| 武定县| 象州县| 浦东新区| 报价| 宾川县| 舒城县| 印江| 汤原县| 根河市| 五原县| 闽清县| 越西县| 洞头县| 定西市| 贵港市| 和政县| 巴彦县| 海伦市| 勃利县| 金秀| 新巴尔虎左旗| 昌宁县| 南丰县| 永泰县| 邹平县| 田林县| 比如县|