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

Python greenlet實現原理和使用示例
來源:易賢網 閱讀:1543 次 日期: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實現原理和使用示例
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
夜夜夜久久久| 国产精品乱子乱xxxx| 免费黄网站欧美| 一区二区三区在线视频播放| 久久国产福利国产秒拍| 在线观看国产一区二区| 欧美激情一二三区| 亚洲综合国产精品| 最新成人av在线| 国产精品一区二区久久精品| 欧美成人官网二区| 国产精品日韩一区| 一区在线免费观看| 久久久久国产精品一区| 亚洲一区日韩| 国产一区二区三区四区hd| 久久婷婷国产综合精品青草| 精品成人久久| 欧美日韩成人在线观看| 国产一区二区久久精品| 久久久亚洲国产天美传媒修理工| 99xxxx成人网| 欧美三级在线视频| 久久综合色一综合色88| 亚洲久久一区二区| 国产亚洲成av人在线观看导航| 久久综合色影院| 欧美成人国产va精品日本一级| 麻豆成人在线| 欧美高清视频一区| 久久久久久夜| 老司机一区二区三区| 久久久国产亚洲精品| 久久精品理论片| 欧美一区二区三区男人的天堂| 亚洲视频一区在线观看| 性18欧美另类| 欧美日韩福利| 国产精品久久久久久久久免费| 欧美性色视频在线| 国产精品最新自拍| 国产专区欧美精品| 在线成人亚洲| 夜夜精品视频| 久久激情五月激情| 国产精品人人爽人人做我的可爱| 国产欧美欧美| 亚洲欧洲综合另类| 亚洲在线一区二区三区| 久久这里有精品15一区二区三区| 欧美a级在线| 国产精品mv在线观看| 欧美日韩亚洲一区三区 | 亚洲欧美日韩网| 午夜精品久久久久久久久| 久久在线免费| 国产精品激情av在线播放| 国内精品久久久久影院色| 久久精品国产综合精品| 国产精品任我爽爆在线播放| 亚洲二区免费| 亚洲视频碰碰| 欧美精品三级日韩久久| 亚洲三级观看| 亚洲欧美中文在线视频| 亚洲精品欧美一区二区三区| 国产精品一区二区在线| 亚洲国产免费看| 欧美激情国产高清| 亚洲福利小视频| 午夜精品美女自拍福到在线 | 久久精品123| 久久精品国产综合精品| 欧美色区777第一页| 亚洲日本电影| aa级大片欧美三级| 欧美www视频在线观看| 极品日韩av| 亚洲一区日韩在线| 国产精品一区二区欧美| 欧美一级理论性理论a| 激情婷婷欧美| 欧美日韩在线大尺度| 亚洲国产片色| 国产精品久久久久久久浪潮网站| 狠狠色综合一区二区| 久久riav二区三区| 亚洲欧洲视频在线| 国产日韩欧美自拍| 欧美国产精品劲爆| 久久精品国产清自在天天线| 亚洲精品免费在线| 国产在线观看91精品一区| 欧美丝袜一区二区| 六月婷婷久久| 亚洲欧美日韩精品久久亚洲区 | 韩国av一区二区三区| 免费欧美在线| 欧美一区二区三区免费观看| 亚洲国产91精品在线观看| 国产精品美女久久久浪潮软件| 久久国产欧美日韩精品| 亚洲欧美国产毛片在线| 中文在线不卡| 999在线观看精品免费不卡网站| 国产日韩精品一区二区| 欧美日韩中文字幕在线视频| 欧美视频四区| 国产精品男人爽免费视频1| 欧美久久久久久久久| 麻豆成人av| 蜜桃视频一区| 欧美国产乱视频| 久久久在线视频| 久久精品1区| 久久色中文字幕| 欧美中文字幕| 欧美99在线视频观看| 欧美国产日韩一区二区在线观看 | 久久综合九九| 免费欧美日韩| 欧美日韩亚洲一区三区| 国产精品日产欧美久久久久| 国产目拍亚洲精品99久久精品| 国产精品乱码一区二三区小蝌蚪 | 久久夜色精品国产亚洲aⅴ| 激情综合在线| 亚洲国产精品ⅴa在线观看 | 国产精品视频网| 国产精品中文在线| 韩国欧美一区| 亚洲一区视频| 9久草视频在线视频精品| 久久国产精品黑丝| 欧美夫妇交换俱乐部在线观看| 国产乱人伦精品一区二区| 欧美 日韩 国产在线 | 欧美电影免费观看网站| 欧美网站在线| 在线观看国产成人av片| 一本久道久久综合狠狠爱| 欧美激情久久久| 欧美精品国产一区二区| 国产精品一区二区欧美| 亚洲日韩视频| 久久久久网址| 国产精品免费视频观看| 亚洲精品欧洲精品| 欧美 日韩 国产一区二区在线视频| 国产精品h在线观看| 国产一区二区无遮挡| 亚洲第一黄色网| 一区二区三区日韩| 欧美激情一区二区三区在线视频 | 欧美日韩一区成人| 精品成人一区二区三区| 亚洲欧美日本在线| 欧美va亚洲va日韩∨a综合色| 亚洲国产婷婷| 久久综合中文色婷婷| 黄色亚洲大片免费在线观看| 篠田优中文在线播放第一区| 欧美天堂在线观看| 亚洲女女做受ⅹxx高潮| 欧美香蕉大胸在线视频观看| 亚洲欧洲一区二区在线播放 | 国产精品高潮呻吟久久av无限| 亚洲人www| 国产综合色产在线精品| 欧美日韩国产一区二区三区地区 | 欧美顶级少妇做爰| 一区二区三区产品免费精品久久75 | 午夜在线不卡| 狠久久av成人天堂| 欧美大片在线观看一区| 亚洲一区日韩在线| 亚洲国产专区| 国产乱码精品一区二区三区av| 国产精品久久久久久久久久久久| 一区二区三区精品视频在线观看| 亚洲第一毛片| 国产精品一国产精品k频道56| 免费亚洲一区| 欧美在线free| 亚洲一区制服诱惑| 亚洲精品免费一区二区三区| 韩国成人福利片在线播放| 欧美制服丝袜第一页| 每日更新成人在线视频| 久久久久久色| 欧美大成色www永久网站婷| 你懂的成人av| 欧美日韩国产不卡| 国产精品草莓在线免费观看| 亚洲欧美一区二区视频| 欧美日韩在线精品| 欧美福利在线| 欧美xxx在线观看| 欧美日韩 国产精品| 国产精品久久久久一区二区三区 |