最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python使用協(xié)程實現(xiàn)并發(fā)操作的方法詳解

 更新時間:2019年12月27日 11:51:24   作者:雪山飛豬  
這篇文章主要介紹了python使用協(xié)程實現(xiàn)并發(fā)操作的方法,結(jié)合實例形式詳細分析了Python協(xié)程的原理及使用Gevent實現(xiàn)協(xié)程操作的相關(guān)技巧與操作注意事項,需要的朋友可以參考下

本文實例講述了python使用協(xié)程實現(xiàn)并發(fā)操作的方法。分享給大家供大家參考,具體如下:

協(xié)程

協(xié)程是一種用戶態(tài)的輕量級線程,又稱微線程。

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

優(yōu)點:

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

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

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

缺點:

  1. 無法利用多核資源:協(xié)程的本質(zhì)是個單線程,它不能同時將 單個CPU 的多個核用上,協(xié)程需要和進程配合才能運行在多CPU上.當(dāng)然我們?nèi)粘K帉懙慕^大部分應(yīng)用都沒有這個必要,除非是cpu密集型應(yīng)用。
  2. 進行阻塞(Blocking)操作(如IO時)會阻塞掉整個程序

使用Gevent

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

  • 簡單示例

gevent的sleep可以交出控制權(quán),當(dāng)我們在受限于網(wǎng)絡(luò)或IO的函數(shù)中使用gevent,這些函數(shù)會被協(xié)作式的調(diào)度, gevent的真正能力會得到發(fā)揮。Gevent處理了所有的細節(jié), 來保證你的網(wǎng)絡(luò)庫會在可能的時候,隱式交出greenlet上下文的執(zhí)行權(quán)。

import gevent
def 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')
# 創(chuàng)建線程并行執(zhí)行程序
gevent.joinall([
  gevent.spawn(foo),
  gevent.spawn(bar),
])

執(zhí)行結(jié)果

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

  • 同步異步
import random
import gevent
def 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()

執(zhí)行輸出

Synchronous:
Task 1 done
Task 2 done
Task 3 done
Task 4 done
Task 5 done
Task 6 done
Task 7 done
Task 8 done
Task 9 done
Asynchronous:
Task 1 done
Task 4 done
Task 5 done
Task 9 done
Task 6 done
Task 0 done
Task 2 done
Task 3 done
Task 7 done
Task 8 done

  • 以子類的方法使用協(xié)程

可以子類化Greenlet類,重載它的_run方法,類似多線程和多進程模塊

import gevent
from gevent import Greenlet
class Test(Greenlet):
  def __init__(self, message, n):
    Greenlet.__init__(self)
    self.message = message
    self.n = n
  def _run(self):
    print(self.message, 'start')
    gevent.sleep(self.n)
    print(self.message, 'end')
tests = [
  Test("hello", 3),
  Test("world", 2),
]
for test in tests:
  test.start() # 啟動
for test in tests:
  test.join() # 等待執(zhí)行結(jié)束

  • 使用monkey patch修改系統(tǒng)標(biāo)準(zhǔn)庫(自動切換協(xié)程)

當(dāng)一個greenlet遇到IO操作時,比如訪問網(wǎng)絡(luò),就自動切換到其他的greenlet,等到IO操作完成,再在適當(dāng)?shù)臅r候切換回來繼續(xù)執(zhí)行。

由于IO操作非常耗時,經(jīng)常使程序處于等待狀態(tài),有了gevent為我們自動切換協(xié)程,就保證總有g(shù)reenlet在運行,而不是等待IO。

由于切換是在IO操作時自動完成,所以gevent需要修改Python自帶的一些標(biāo)準(zhǔn)庫,這一過程在啟動時通過monkey patch完成

import gevent
import requests
from gevent import monkey
monkey.patch_socket()
def task(url):
  r = requests.get(url)
  print('%s bytes received from %s' % (len(r.text), url))
gevent.joinall([
  gevent.spawn(task, 'https://www.baidu.com/'),
  gevent.spawn(task, 'https://www.qq.com/'),
  gevent.spawn(task, 'https://www.jd.com/'),
])

執(zhí)行輸出

2443 bytes received from https://www.baidu.com/
108315 bytes received from https://www.jd.com/
231873 bytes received from https://www.qq.com/

可以看出3個網(wǎng)絡(luò)操作是并發(fā)執(zhí)行的,而且結(jié)束順序不同

參考鏈接:http://hhkbp2.github.io/gevent-tutorial/

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python進程與線程操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》、《Python+MySQL數(shù)據(jù)庫程序設(shè)計入門教程》及《Python常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對大家Python程序設(shè)計有所幫助。

相關(guān)文章

  • 關(guān)于命令行執(zhí)行Python腳本的傳參方式

    關(guān)于命令行執(zhí)行Python腳本的傳參方式

    這篇文章主要介紹了關(guān)于命令行執(zhí)行Python腳本的傳參方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Anaconda如何查看自己目前安裝的包詳解

    Anaconda如何查看自己目前安裝的包詳解

    Anaconda是一種用于數(shù)據(jù)科學(xué)和機器學(xué)習(xí)的開源發(fā)行版,它包含了很多常用的Python包和工具,如NumPy、Pandas、Scipy、Scikit-Learn等,下面這篇文章主要給大家介紹了關(guān)于Anaconda如何查看自己目前安裝的包的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Python字符串常用方法以及其應(yīng)用場景詳解

    Python字符串常用方法以及其應(yīng)用場景詳解

    本人學(xué)習(xí)python時的總結(jié),并不需要記住,知道有這個方法,拿起來用就行,下面這篇文章主要給大家介紹了關(guān)于Python字符串常用方法以及其應(yīng)用場景的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Python實現(xiàn)輕松合并doc為txt的示例代碼

    Python實現(xiàn)輕松合并doc為txt的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Python編程語言和wxPython模塊,打開指定文件夾中的DOC文檔,并將它們的內(nèi)容合并成一個便捷的TXT文檔,需要的可以參考下
    2024-03-03
  • 教你使用Python pypinyin庫實現(xiàn)漢字轉(zhuǎn)拼音

    教你使用Python pypinyin庫實現(xiàn)漢字轉(zhuǎn)拼音

    今天,發(fā)現(xiàn)了一個好玩兒的庫,叫做 “pypinyin ”,用于幫助我們實現(xiàn)漢字轉(zhuǎn)拼音,文中有非常詳細的代碼示例,對正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Python新手最容易踩的坑及避坑指南

    Python新手最容易踩的坑及避坑指南

    學(xué)習(xí)Python時新手可能會遇到縮進錯誤、忘記引入模塊、使用未定義的變量、變量作用域理解不當(dāng)、字符串格式化錯誤等問題,本文詳細介紹了這些常見陷阱及其解決方案,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-10-10
  • pycharm使用matplotlib畫圖問題解決方法

    pycharm使用matplotlib畫圖問題解決方法

    Pycharm是一款功能強大的Python集成開發(fā)環(huán)境(IDE),它提供了許多有用的工具和功能,可以幫助開發(fā)人員更輕松地編寫和調(diào)試Python代碼,其中一個有用的工具是Pycharm如何畫圖,本文給大家介紹在pycharm中使用matplotlib畫圖問題,感興趣的朋友一起看看吧
    2023-11-11
  • Python Django實現(xiàn)個人博客系統(tǒng)的搭建

    Python Django實現(xiàn)個人博客系統(tǒng)的搭建

    個人博客是一個非常好的平臺,可以讓人們分享自己的知識和經(jīng)驗,也可以讓人們交流和互動。在這篇文章中,我們將介紹如何使用Python Django框架來開發(fā)一個個人博客系統(tǒng),希望對大家有所幫助
    2023-04-04
  • python+selenium select下拉選擇框定位處理方法

    python+selenium select下拉選擇框定位處理方法

    今天小編就為大家分享一篇python+selenium select下拉選擇框定位處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python?GUI和游戲開發(fā)從入門到實踐

    Python?GUI和游戲開發(fā)從入門到實踐

    GUI是圖形用戶界面的縮寫,圖形化的用戶界面對使用過計算機的人來說應(yīng)該都不陌生,下面這篇文章主要給大家介紹了關(guān)于Python圖形用戶界面與游戲開發(fā)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05

最新評論

红原县| 习水县| 伊通| 达拉特旗| 栾川县| 柳林县| 柳河县| 五大连池市| 项城市| 乐业县| 山丹县| 夏河县| 乌兰浩特市| 馆陶县| 时尚| 苗栗市| 通河县| 黄大仙区| 望奎县| 孟州市| 昌乐县| 重庆市| 云南省| 峨山| 禹州市| 聂荣县| 太仆寺旗| 广饶县| 福贡县| 乌兰察布市| 江源县| 青岛市| 鄂托克旗| 孟州市| 蒲江县| 望奎县| 临江市| 黄大仙区| 遵义市| 朝阳市| 乐安县|