中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

Python greenlet實現原理和使用示例
來源:易賢網 閱讀:1612 次 日期:2014-09-25 10:01:11
溫馨提示:易賢網小編為您整理了“Python greenlet實現原理和使用示例”,方便廣大網友查閱!

最近開始研究Python的并行開發技術,包括多線程,多進程,協程等。逐步整理了網上的一些資料,今天整理了一下greenlet相關的資料。

并發處理的技術背景

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

greenlet的實現機制

以前使用python開發web程序,一直使用的是fastcgi模式.然后每個進程中啟動多個線程來進行請求處理.這里有一個問題就是需要保證每個請求響應時間都要特別短,不然只要多請求幾次慢的就會讓服務器拒絕服務,因為沒有線程能夠響應請求了.平時我們的服務上線都會進行性能測試的,所以正常情況沒有太大問題.但是不可能所有場景都測試到.一旦出現就會讓用戶等好久沒有響應.部分不可用導致全部不可用.后來轉換到了coroutine,python 下的greenlet.所以對它的實現機制做了一個簡單的了解.

每個greenlet都只是heap中的一個python object(PyGreenlet).所以對于一個進程你創建百萬甚至千萬個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;

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

下面是greenlet的一個簡單的棧空間模型(from greenlet.c)

代碼如下:

A PyGreenlet is a range of C stack addresses that must be

saved and restored in such a way that the full range of the

stack contains valid data when we switch to it.

Stack layout for a greenlet:

| ^^^ |

| older data |

| |

stack_stop . |_______________|

. | |

. | greenlet data |

. | in stack |

. * |_______________| . . _____________ stack_copy + stack_saved

. | | | |

. | data | |greenlet data|

. | unrelated | | saved |

. | to | | in heap |

stack_start . | this | . . |_____________| stack_copy

| greenlet |

| |

| newer data |

| vvv |

下面是一段簡單的greenlet代碼.

代碼如下:

from greenlet import greenlet

def test1():

print 12

gr2.switch()

print 34

def test2():

print 56

gr1.switch()

print 78

gr1 = greenlet(test1)

gr2 = greenlet(test2)

gr1.switch()

目前所討論的協程,一般是編程語言提供支持的。目前我所知提供協程支持的語言包括python,lua,go,erlang, scala和rust。協程不同于線程的地方在于協程不是操作系統進行切換,而是由程序員編碼進行切換的,也就是說切換是由程序員控制的,這樣就沒有了線程所謂的安全問題。

所有的協程都共享整個進程的上下文,這樣協程間的交換也非常方便。

相對于第二種方案(I/O多路復用),使得使用協程寫的程序將更加的直觀,而不是將一個完整的流程拆分成多個管理的事件處理。協程的缺點可能是無法利用多核優勢,不過,這個可以通過協程+進程的方式來解決。

協程可以用來處理并發來提高性能,也可以用來實現狀態機來簡化編程。我用的更多的是第二個。去年年底接觸python,了解到了python的協程概念,后來通過pycon china2011接觸到處理yield,greenlet也是一個協程方案,而且在我看來是更可用的一個方案,特別是用來處理狀態機。

目前這一塊已經基本完成,后面抽時間總結一下。

總結一下:

1)多進程能夠利用多核優勢,但是進程間通信比較麻煩,另外,進程數目的增加會使性能下降,進程切換的成本較高。程序流程復雜度相對I/O多路復用要低。

2)I/O多路復用是在一個進程內部處理多個邏輯流程,不用進行進程切換,性能較高,另外流程間共享信息簡單。但是無法利用多核優勢,另外,程序流程被事件處理切割成一個個小塊,程序比較復雜,難于理解。

3)線程運行在一個進程內部,由操作系統調度,切換成本較低,另外,他們共享進程的虛擬地址空間,線程間共享信息簡單。但是線程安全問題導致線程學習曲線陡峭,而且易出錯。

4)協程有編程語言提供,由程序員控制進行切換,所以沒有線程安全問題,可以用來處理狀態機,并發請求等。但是無法利用多核優勢。

上面的四種方案可以配合使用,我比較看好的是進程+協程的模式。

更多信息請查看IT技術專欄

更多信息請查看腳本欄目
易賢網手機網站地址:Python greenlet實現原理和使用示例
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
久久综合九色综合欧美亚洲| 色综合咪咪久久| 欧美精品欧美精品系列| 在线一区二区观看| 欧美三级三级三级| 欧美日韩另类一区| 91精品综合久久久久久| 日韩欧美不卡一区| 精品久久久久久久人人人人传媒 | 欧美日韩视频在线观看一区二区三区| 亚洲精品高清视频在线观看| 最新热久久免费视频| 自拍偷拍亚洲欧美日韩| 亚洲自拍另类综合| 久久精品二区亚洲w码| 国产在线精品一区二区不卡了| 亚洲免费观看高清| 五月激情综合婷婷| 国产一区二区美女诱惑| 成人精品一区二区三区中文字幕 | 久久国产麻豆精品| 国产精品一卡二| a亚洲天堂av| 337p亚洲精品色噜噜| 欧美精品一区二| 一区二区三区中文免费| 奇米色一区二区| 午夜不卡av在线| 国产精品一卡二| 蜜臀av亚洲一区中文字幕| 国产91精品入口| 欧美日韩国产小视频在线观看| 99国产精品久久久久久久久久 | 美女诱惑一区二区| 粉嫩在线一区二区三区视频| 激情文学综合丁香| 色中色一区二区| 欧美白人最猛性xxxxx69交| 亚洲欧美激情小说另类| 成人免费在线播放视频| 国产欧美日韩不卡免费| 欧美mv日韩mv亚洲| 在线观看91av| 亚洲欧美日本韩国| 国内一区二区视频| 欧美日韩黄视频| 亚洲日本在线视频观看| 国产激情偷乱视频一区二区三区| 极品尤物av久久免费看| 在线看国产一区| 亚洲欧美日韩系列| 成人免费视频一区| 99视频精品在线| 亚洲国产精品精华液ab| 麻豆精品久久精品色综合| 狠狠色狠狠色合久久伊人| 欧美三片在线视频观看| 一区二区三区在线观看动漫| 国产成a人亚洲| 久久久噜噜噜久久中文字幕色伊伊 | 欧美日韩国产中文| 一区av在线播放| 三级亚洲高清视频| 欧美久久一二三四区| 亚洲精品视频自拍| 色婷婷综合中文久久一本| 中文字幕亚洲区| 99国产精品一区| 亚洲男帅同性gay1069| 91网站黄www| 亚洲精品福利视频网站| 在线观看日韩精品| 亚洲成av人影院| 在线播放中文字幕一区| 人人狠狠综合久久亚洲| 日韩美一区二区三区| 麻豆一区二区在线| 久久这里只精品最新地址| 国产精品资源站在线| 国产精品每日更新| 日韩国产成人精品| 99久久免费视频.com| 亚洲日本va在线观看| 欧美色图免费看| 蜜桃久久av一区| 国产偷国产偷亚洲高清人白洁| 午夜av一区二区三区| 538prom精品视频线放| 麻豆精品在线看| 久久久激情视频| 色综合夜色一区| 免费人成精品欧美精品| 国产亚洲一本大道中文在线| av在线不卡网| 久久久www成人免费毛片麻豆| 婷婷亚洲久悠悠色悠在线播放| 成人av电影在线| 26uuu亚洲综合色| 一本一本大道香蕉久在线精品| 精品久久久久久最新网址| 福利一区在线观看| 国产不卡高清在线观看视频| 亚洲女同女同女同女同女同69| 久久99精品一区二区三区三区| caoporen国产精品视频| 亚洲在线观看免费| 福利电影一区二区三区| 最新国产成人在线观看| 91久久奴性调教| 亚洲精品videosex极品| 丰满少妇在线播放bd日韩电影| 极品少妇xxxx偷拍精品少妇| 久久综合色鬼综合色| 一区二区三区日韩精品视频| 综合激情网...| 91国在线观看| 久久中文娱乐网| 国产精品一区在线观看乱码| 91精品在线观看入口| 欧美96一区二区免费视频| 欧美色图在线观看| 最新不卡av在线| 国产91精品一区二区麻豆网站 | 精品国产免费一区二区三区香蕉| 日日夜夜精品免费视频| 日韩福利电影在线观看| 亚洲国产成人91porn| 成人性色生活片| 国产午夜精品一区二区三区视频 | 精品国产sm最大网站| 亚洲国产裸拍裸体视频在线观看乱了 | 日韩影视精彩在线| 日本久久一区二区| 亚洲乱码国产乱码精品精可以看| 国产99精品在线观看| 国产精品乱码人人做人人爱| 99久久99久久精品免费观看| 亚洲欧美另类小说视频| 欧美剧在线免费观看网站| 看电影不卡的网站| 中文字幕不卡一区| 91免费视频观看| 美洲天堂一区二卡三卡四卡视频| 日韩精品一区二区在线| 国产成人丝袜美腿| 一区二区欧美视频| 中文字幕一区在线观看视频| 99久久er热在这里只有精品15| 美国三级日本三级久久99| 精品一区二区三区在线观看| 亚洲精品欧美专区| 国产69精品久久777的优势| 国产精品入口麻豆九色| 欧美三级午夜理伦三级中视频| 久国产精品韩国三级视频| 日韩专区在线视频| 91精品国产色综合久久不卡电影| 天天影视网天天综合色在线播放| 日本精品视频一区二区三区| 亚洲综合一区二区| 成人欧美一区二区三区视频网页| 亚洲国产精品精华液ab| 中文字幕中文字幕一区二区| 日韩一区中文字幕| 午夜精品久久久久久久久| 美腿丝袜亚洲三区| 国产91在线观看丝袜| 在线观看日产精品| 91精品国产丝袜白色高跟鞋| 日韩一级在线观看| 中文字幕av资源一区| 亚洲另类在线制服丝袜| 麻豆视频一区二区| 国产乱码精品一区二区三区五月婷| 国产乱码精品一区二区三区忘忧草 | 亚洲成人资源网| 亚洲国产va精品久久久不卡综合| 亚洲成av人片一区二区| 精品在线你懂的| 波多野结衣在线aⅴ中文字幕不卡| 99re热视频这里只精品| 555www色欧美视频| 欧美国产日本视频| 日本一道高清亚洲日美韩| 国产精品一二三区在线| 色综合视频在线观看| 91麻豆精品国产91久久久使用方法| 国产亚洲美州欧州综合国| 亚洲综合在线观看视频| 国产一区二区三区四区五区美女| 91香蕉视频污在线| 日韩一区二区三| 亚洲精品成人天堂一二三| 老色鬼精品视频在线观看播放| a美女胸又www黄视频久久| 欧美mv日韩mv国产网站app| 一区二区三区四区乱视频| 精品欧美乱码久久久久久| 亚洲乱码国产乱码精品精可以看 | 欧美激情中文字幕|