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

首頁 > 編程 > Python > 正文

python編程使用協程并發的優缺點

2020-02-15 23:01:16
字體:
來源:轉載
供稿:網友

協程

協程是一種用戶態的輕量級線程,又稱微線程。

協程擁有自己的寄存器上下文和棧,調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧。因此:協程能保留上一次調用時的狀態(即所有局部狀態的一個特定組合),每次過程重入時,就相當于進入上一次調用的狀態,換種說法:進入上一次離開時所處邏輯流的位置。

優點:

1.無需線程上下文切換的開銷
2.無需原子操作鎖定及同步的開銷
3.方便切換控制流,簡化編程模型
4.高并發+高擴展性+低成本:一個CPU支持上萬的協程都不是問題。所以很適合用于高并發處理。

所謂原子操作是指不會被線程調度機制打斷的操作;這種操作一旦開始,就一直運行到結束,中間不會有任何 context switch (切換到另一個線程)。

原子操作可以是一個步驟,也可以是多個操作步驟,但是其順序是不可以被打亂,或者切割掉只執行部分。視作整體是原子性的核心。

缺點:

1.無法利用多核資源:協程的本質是個單線程,它不能同時將 單個CPU 的多個核用上,協程需要和進程配合才能運行在多CPU上.當然我們日常所編寫的絕大部分應用都沒有這個必要,除非是cpu密集型應用。
2.進行阻塞(Blocking)操作(如IO時)會阻塞掉整個程序

使用Gevent

gevent是python的一個并發框架,以微線程greenlet為核心,使用了epoll事件監聽機制以及諸多其他優化而變得高效.

•簡單示例

gevent的sleep可以交出控制權,當我們在受限于網絡或IO的函數中使用gevent,這些函數會被協作式的調度, gevent的真正能力會得到發揮。Gevent處理了所有的細節, 來保證你的網絡庫會在可能的時候,隱式交出greenlet上下文的執行權。

import geventdef foo():  print('running in foo')  gevent.sleep(0)  print('com back from bar in to foo')def bar():  print('running in bar')  gevent.sleep(0)  print('com back from foo in to bar')# 創建線程并行執行程序gevent.joinall([  gevent.spawn(foo),  gevent.spawn(bar),]) 

  執行結果

running in foo
running in bar
com back from bar in to foo
com back from foo in to bar

•同步異步

import randomimport geventdef task(pid):  gevent.sleep(random.randint(0, 2) * 0.001)  print('Task %s done' % pid)def synchronous():  for i in range(1, 10):    task(i)def asynchronous():  threads = [gevent.spawn(task, i) for i in range(10)]  gevent.joinall(threads)print('Synchronous:')synchronous()print('Asynchronous:')asynchronous() 

  執行輸出

Synchronous:

Task 1 done

Task 2 done

Task 3 done

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 扶沟县| 高青县| 米泉市| 增城市| 宜宾县| 新巴尔虎左旗| 镇平县| 勐海县| 东明县| 龙岩市| 墨竹工卡县| 乃东县| 方山县| 洛隆县| 灯塔市| 驻马店市| 襄垣县| 桂阳县| 襄汾县| 淮滨县| 攀枝花市| 蛟河市| 南阳市| 沾益县| 绿春县| 张家口市| 东城区| 金昌市| 遵义市| 锦州市| 广昌县| 边坝县| 武清区| 美姑县| 榆社县| 丽水市| 绥芬河市| 秦皇岛市| 余江县| 海阳市| 稷山县|