學習筆記(35):Python網絡編程并發編程-協程(yield,greenlet,gevent模塊)

立即學習:https://edu.csdn.net/course/play/24458/296457?utm_source=blogtoedu

協程(yield,greenlet,gevent)

?

1.協程:在單線程中通過不斷地在多個任務之間進行切換執行,來達到并發的效果的線程,可以提高效率

?

2.yield實現協程

#yield = return + generator(生成器)
#有yield的函數就是生成器,不會直接執行函數,首先獲得生成器對象然后使用next函數這才開始運行函數
#next方法#并發執行
import time
def productor():g = costumor()for i in range(100):res = next(g)print(res)def costumor():for i in range(100):res = yield "*"*5+"%s"%i+'*'*5if __name__ == '__main__':start_time = time.time()productor()end_time = time.time()print('%.9f'%float(end_time-start_time))#串行
def productor():res = costumor()for i in res:print('*'*5+str(i)+"*"*5)def costumor():res=[]for i in range(100):res.append(i)return resif __name__ == '__main__':start_time = time.time()productor()end_time = time.time()print('%.9f'%float(end_time-start_time))

?

3.greenlet實現協程

#greenlet也是i一個可以實現單線程內并發的效果,但是和yield一樣不能檢測i/o模型
#切換的格式為:
'''
g1 = greenlet(function1)#獲得對象
g2.switch(para)#從當前任務切換到g2對應的任務中
'''
#協程并發
from greenlet import greenlet#定義函數一
def eat(name):print('%s1 is eating'%name)g2.switch('同學')print('%s2 is eating'%name)g2.switch()#定義函數2
def play(name):print('%s1 is playing'%name)g1.switch()print('%s2 is playing'%name)if __name__ == '__main__':g1 = greenlet(eat)g2 = greenlet(play)g1.switch('同學')

?

4.gevent實現協程


#1.gevent模塊是基于greenlet模塊的,具有檢測自身I/O操作的功能
import gevent,time#定義任務1
def eat(name):print('%s eat 1'%name)#自身的I/O操作。可以被檢測出,一旦檢測出就自動進行任務·切換gevent.sleep(3)print('%s eat 2'%name)#定義任務2
def play(name):print('%s play 1'%name)gevent.sleep(4)print('%s play 2'%name)start_time = time.time()
#創建gevent對象,只是提交了任務,要想出結果,必須跟join函數配對使用
g1 = gevent.spawn(eat,'john')
g2 = gevent.spawn(play,'lucy')g1.join()
g2.join()
end_time = time.time()
print(end_time-start_time)
'''
運行結果:
john eat 1
lucy play 1
john eat 2
lucy play 2
4.0197389125823975#運行時間接近4秒,即兩個任務并發執行的#首先該程序是單線程,只有一個主線程,但是含有兩個任務,首先按照代碼從上到下執行,
執行到創建對象時,會自動跳轉到對應的函數中去,如g1跳到eat函數,執行第一次打印,
檢測到自身gevent.sleep()I/O操作后,就自動切換到下一個任務,執行play函數的第一次
打印,后面就是兩個任務均處于等待狀態,期間一直在兩個任務之間切換進行檢測,因為eat時間短,
所以先執行eat函數的第二次打印任務,接著就是Play的第二次打印#因此這里實現了單線程兩個任務并發的效果
'''#2.gevent模塊是基于greenlet模塊的,具有檢測自身I/O操作的功能,不能檢測自身以外的I/O操作,如time.sleep()
import gevent,time#定義任務1
def eat(name):print('%s eat 1'%name)#自身的I/O操作。可以被檢測出,一旦檢測出就自動進行任務·切換time.sleep(3)print('%s eat 2'%name)#定義任務2
def play(name):print('%s play 1'%name)time.sleep(4)print('%s play 2'%name)start_time = time.time()
#創建gevent對象,只是異步提交了任務,不會等結果的出來,要想出結果,必須跟join函數或者和joinall()配對使用,
g1 = gevent.spawn(eat,'john')
g2 = gevent.spawn(play,'lucy')g1.join()
g2.join()
#gevent.joinall([g1,g2])
end_time = time.time()
print(end_time-start_time)
'''
john eat 1
john eat 2
lucy play 1
lucy play 2
7.019653797149658
#運行時間接近與兩個任務I/O操作的時間總和,因此gevent不能檢測出自身以為的I/O操作
'''#3.gevent.monkey.patch_all():可以檢測到自身以外的I/O操作
import gevent,time
from gevent import monkey
monkey.patch_all()#定義任務1
def eat(name):print('%s eat 1'%name)#自身的I/O操作。可以被檢測出,一旦檢測出就自動進行任務·切換time.sleep(3)print('%s eat 2'%name)#定義任務2
def play(name):print('%s play 1'%name)time.sleep(4)print('%s play 2'%name)start_time = time.time()
#創建gevent對象,只是提交了任務,要想出結果,必須跟join函數配對使用
g1 = gevent.spawn(eat,'john')
g2 = gevent.spawn(play,'lucy')g1.join()
g2.join()
end_time = time.time()
print(end_time-start_time)
'''
john eat 1
lucy play 1
john eat 2
lucy play 2
4.009758949279785#說明檢測到了time.sleep()的I/O操作,自動進行切換,實現了單線程并發的效果
'''

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256910.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256910.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256910.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

雙目標定算法

坐標系基礎知識: > 1.1. 從像素坐標系(u,v) 到 世界坐標系(Xw,Yw,Yw) 這里直接拿上篇博文的結果,中間省去了其它坐標系直接的關系,直接給出,如下所示: 公式如下: > 1.2. 符號規定( Notation ) 為了…

Spring bean三種創建方式

spring共提供了三種實例化bean的方式:構造器實例化(全類名,反射)、工廠方法(靜態工廠實例化 動態工廠實例化)和FactoryBean ,下面一一詳解: 1、構造器實例化 City.java 1 package com.proc.bean;2 3 publ…

Excel使用控件創建動態地圖圖表

[本文軟件Excel 2010] 效果圖: 首先我們看一下數據源 數據源中第二列是對應圖形的名稱。首先創建圖形,我們可能在網絡中找到各個地圖的矢量圖形。不過不是每個地圖圖形都適合我們,或許企業劃分非按照行政區劃分。因此可以嘗試自己繪制&#x…

Windows 10 常用的快捷鍵及常用指令

系統快捷鍵 快捷鍵功能說明備注CtrlShiftEsc打開任務管理器macbook: fnshiftF11普通鍵盤: PrintScreen截屏幕圖macbook: fnshiftoptionF11普通鍵盤: altPrintScreen截取當前窗口圖片macbook: WinfnEsc普通鍵盤: WinPause/Break打開系統屬性WinctrlD新建虛擬桌面Windows 10Winct…

學習筆記(35續):Python網絡編程并發編程-基于gevent及線程池實現的并發套接字通訊

1.基于線程池實現并發套接字通訊:因為套接字涉及地是I/O密集模型,因此使用多線程會有高效率 服務器 #基于線程池完成并發的套接字通訊 from socket import * from threading import Thread from concurrent.futures import ThreadPoolExecutordef commun…

使用Configuration Manager部署及管理軟件更新(2)

承接上一篇文章:http://ericxuting.blog.51cto.com/8995534/1543835 一、 確定軟件更新符合性 1. 打開Configuration Manager管理控制臺,點擊軟件庫,展開軟件更新,點擊所有軟件更新 2. 點擊主頁中的運行摘要,等待對話框…

NULL、nil、Nil、NSNull的區別

標志值含義NULL(void *)0C指針的字面零值nil(id)0Objecve-C對象的字面零值Nil(Class)0Objecve-C類的字面零值NSNull[NSNull null]用來表示零值的單獨的對象轉載于:https://www.cnblogs.com/wlsxmhz/p/56250…

Fiddler 域名過濾

原來一直沒意識到Fiddler過濾,導致每次抓包都要自己判斷、搜索好多東西,真是呵呵! 過濾設置很簡單,看懂一張圖就解決問題了。 箭頭 那兩處設置下,圓圈處保存再進行抓包即可 轉載于:https://www.cnblogs.com/eejron/p/4…

windows中VS卸載opencv配置,重新安裝其他版本

1、找到工程的屬性管理器,電機Debug64和Release64下面的 包含目錄和庫目錄,刪掉其原由配置的oepncv路徑; 找到鏈接器中的附加依賴項,刪掉原有的配置;

學習筆記(36):Python網絡編程并發編程-IO模型介紹

立即學習:https://edu.csdn.net/course/play/24458/296460?utm_sourceblogtoedu I/O模型介紹:I/O模型表示處于等待狀態的模型,如套接字通訊的accept和recv函數一樣 1.同步I/O 2.異步I/O 3.阻塞I/O 4.非阻塞I/O

AD9 如何畫4層pcb板

新建的PCB文件默認的是2層板,教你怎么設置4層甚至更多層板。在工具欄點擊Design-->Layer Stack Manager.進入之后顯示的是兩層板,添加為4層板,一般是先點top layer, 再點Add Layer,再點Add Layer,這樣就成了4層板。見下圖。 有…

gulp 流處理

包含的內容: 穿插流流合并流隊列流篩選1. 穿插流// passthrough stream 把流傳遞給其他的// usegulp.src(glob,{passthrough:true})// function 進行流的合并處理,避免多余配置以及冗余代碼 2. 合并流// 使用merge2// install yarn add merge2 or …

windows上使用cmake 編譯yaml-cpp源碼,生成yam-cpp.lib

1、打開cmake-gui 2、添加CmakeList 3、建立build 4、進入工程中生成debug和release版本的lib

BZOJ 3039: 玉蟾宮( 懸線法 )

最大子矩陣...懸線法..時間復雜度O(nm)懸線法就是記錄一個H向上延伸的最大長度(懸線), L, R向左向右延伸的最大長度, 然后通過遞推來得到. ------------------------------------------------------------------#include<bits/stdc.h>using namespace std;#define ok(c) …

學習筆記(37):Python實戰編程-yield實現生成器

立即學習:https://edu.csdn.net/course/play/19711/255579?utm_sourceblogtoedu1.yield return generator yield是一個返回的是一個生成器對象&#xff0c;是通過next函數一次一次地進行函數地迭代來獲取結果的&#xff0c;而return函數則是將結果返回后&#xff0c;不再與…

ie6、7 下input的邊框問題 ?

input的border設置為none,ie8及以上border都兼容&#xff0c;ie6和7的border還繼續存在&#xff0c;將border設為0時所有瀏覽器上都不存在了&#xff0c;但是border為0時還是會繼續的渲染。 將input的border設為"0 none",ie7及以上都正常了&#xff0c;但是ie6上inpu…

Mocha BSM產品亮點——關聯事件分析

業務需求與挑戰企業經常會遇到下列場景&#xff1a;? 企業某應用&#xff0c;例如&#xff0c;WebSphere Portal Server&#xff0c;已經不可用&#xff0c;是由于應用自身已不可用&#xff1f;還是應用所連接的數據庫出了問題&#xff1f;還是應用的LDAP服務不可用&#xff1…

輕量級文本編輯器,Notepad最佳替代品:Notepad++

目錄 正文之前1. 目的2. 原帖3. 為何推薦Notepad3.1. Notepad的一些基本特點3.2. notepad&#xff0c;notepad2&#xff0c;notepad&#xff0c;ultraEdit比較4. 使用Notepad前要了解的知識4.1. Notepad的名稱和縮寫4.2. Notepad修改設置后&#xff0c;立即生效4.3. Notepad的版…

學習筆記(38):Python實戰編程-窗體顯示

立即學習:https://edu.csdn.net/course/play/19711/343100?utm_sourceblogtoedu GUI&#xff1a;圖形用戶接口——GUI組件&#xff0c;組件定義&#xff0c;組件布局管理 主體窗口的設置&#xff1a; import tkinter#導入創建窗體的相關模塊class Mainwindow():#創建窗口類de…

Tomcat 配置和spring-framework MVC配置簡介

Tomcat啟動時&#xff0c;先找系統變量CATALINA_BASE&#xff0c;如果沒有&#xff0c;則找CATALINA_HOME。然后找這個變量所指的目錄下的conf文件夾&#xff0c;從中讀取配置文件。最重要的配置文件&#xff1a;server.xml 。要配置tomcat&#xff0c;基本上了解server.xml&am…