Python協程--生成器(實現多任務)

0.生成器

在這里插入圖片描述

在這里插入圖片描述在這里插入圖片描述

1.使用yield完成多任務

import timedef task_1():while True:print("---1----")time.sleep(0.1)yielddef task_2():while True:print("---2----")time.sleep(0.1)yielddef main():t1 = task_1()t2 = task_2()# 先讓t1運行一會,當t1中遇到yield的時候,再返回到24行,然后# 執行t2,當它遇到yield的時候,再次切換到t1中# 這樣t1/t2/t1/t2的交替運行,最終實現了多任務....協程while True:next(t1)next(t2)if __name__ == "__main__":main()

運行結果:

---1----
---2----
---1----
---2----
---1----
---2----
---1----
...

2.使用greenlet完成多任務

在這里插入圖片描述

from greenlet import greenlet
import timedef test1():while True:print("---A--")gr2.switch()time.sleep(0.5)def test2():while True:print("---B--")gr1.switch()time.sleep(0.5)#創建生成器對象
gr1 = greenlet(test1)
gr2 = greenlet(test2)#切換到gr1中運行,開始輸出
gr1.switch()

運行結果:

---A--
---B--
---A--
---B--
---A--
....

3.使用gevent完成多任務

在這里插入圖片描述

import gevent
import timedef f1(n):for i in range(n):print(gevent.getcurrent(), i)# time.sleep(0.5)gevent.sleep(0.5) #延時、堵塞等操作,都需要換成gevent里邊的相應方法def f2(n):for i in range(n):print(gevent.getcurrent(), i)# time.sleep(0.5)gevent.sleep(0.5) #延時、堵塞等操作,都需要換成gevent里邊的相應方法def f3(n):for i in range(n):print(gevent.getcurrent(), i)# time.sleep(0.5)gevent.sleep(0.5)  #延時、堵塞等操作,都需要換成gevent里邊的相應方法print("----1---")
g1 = gevent.spawn(f1, 5)
print("----2---")
g2 = gevent.spawn(f2, 5)
print("----3---")
g3 = gevent.spawn(f3, 5)
print("----4---")
g1.join()   # 堵塞,等待完成
g2.join()   # 堵塞,等待完成
g3.join()   # 堵塞,等待完成

運行結果:

----1---
----2---
----3---
----4---
<Greenlet at 0x15bf8f917b8: f1(5)> 0
<Greenlet at 0x15bf8f918c8: f2(5)> 0
<Greenlet at 0x15bf8f919d8: f3(5)> 0
<Greenlet at 0x15bf8f917b8: f1(5)> 1
<Greenlet at 0x15bf8f918c8: f2(5)> 1
<Greenlet at 0x15bf8f919d8: f3(5)> 1
<Greenlet at 0x15bf8f917b8: f1(5)> 2
<Greenlet at 0x15bf8f918c8: f2(5)> 2
<Greenlet at 0x15bf8f919d8: f3(5)> 2
<Greenlet at 0x15bf8f917b8: f1(5)> 3
<Greenlet at 0x15bf8f918c8: f2(5)> 3
<Greenlet at 0x15bf8f919d8: f3(5)> 3
<Greenlet at 0x15bf8f917b8: f1(5)> 4
<Greenlet at 0x15bf8f918c8: f2(5)> 4
<Greenlet at 0x15bf8f919d8: f3(5)> 4

注意,此時使用的延時是gevent.sleep(0.5),若使用time.sleep(0.5),則輸出結果如下:

----1---
----2---
----3---
----4---
<Greenlet at 0x2b3ce8917b8: f1(5)> 0
<Greenlet at 0x2b3ce8917b8: f1(5)> 1
<Greenlet at 0x2b3ce8917b8: f1(5)> 2
<Greenlet at 0x2b3ce8917b8: f1(5)> 3
<Greenlet at 0x2b3ce8917b8: f1(5)> 4
<Greenlet at 0x2b3ce8918c8: f2(5)> 0
<Greenlet at 0x2b3ce8918c8: f2(5)> 1
<Greenlet at 0x2b3ce8918c8: f2(5)> 2
<Greenlet at 0x2b3ce8918c8: f2(5)> 3
<Greenlet at 0x2b3ce8918c8: f2(5)> 4
<Greenlet at 0x2b3ce8919d8: f3(5)> 0
<Greenlet at 0x2b3ce8919d8: f3(5)> 1
<Greenlet at 0x2b3ce8919d8: f3(5)> 2
<Greenlet at 0x2b3ce8919d8: f3(5)> 3
<Greenlet at 0x2b3ce8919d8: f3(5)> 4

4.gevent打補丁

有耗時操作時,需要將程序中用到的耗時操作的代碼,替換成gevent中自己實現的模塊,比如講time.sleep(0.5)自動替換gevent.sleep(0.5),需要打補丁,方法如下:

首先導入:from gevent import monkey
然后執行:monkey.patch_all()

import gevent
import time
from gevent import monkey# 有耗時操作時,需要將程序中用到的耗時操作的代碼,替換成gevent中自己實現的模塊
monkey.patch_all()def f1(n):for i in range(n):print(gevent.getcurrent(), i)time.sleep(0.5)def f2(n):for i in range(n):print(gevent.getcurrent(), i)time.sleep(0.5)def f3(n):for i in range(n):print(gevent.getcurrent(), i)time.sleep(0.5)print("----1---")
g1 = gevent.spawn(f1, 5)
print("----2---")
g2 = gevent.spawn(f2, 5)
print("----3---")
g3 = gevent.spawn(f3, 5)
print("----4---")
g1.join()
g2.join()
g3.join()

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

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

相關文章

技術分享連載(六十一)

資源管理 Q1&#xff1a;Unity5.4.1中&#xff0c;我將需要的Shader打到一個AssetBundle包中&#xff08;包含一個關聯了所有Shader的Shader Variants&#xff09;&#xff0c;分別用Shader.WarmupAllShaders和ShaderVariantCollection.WarmUp兩種方式進行預加載&#xff0c;后…

RabbitMQ(三) 集群配置

RabbitMQ——集群配置 之前不管是搞Redis、SQL、Mongo還是其他的東西&#xff0c;一律都沒說過集群要怎么搞&#xff0c;電腦實在是帶不動、說透徹點就是懶&#xff0c;懶得搭也懶得寫&#xff0c;今日深刻意識到錯誤&#xff0c;做學問是不能懶的&#xff0c;會被人噴的&#…

mysql update實質,UPDATE注射(mysql+php)的兩個模式

UPDATE注射(mysqlphp)的兩個模式2021-01-23 7:48:35424UPDATE注射(mysqlphp)的兩個模式文/安全天使SuperHei2005.8.11一.測試環境&#xff1a;OS:Windowsxpsp2php:php4.3.10(mysql4.1.9apache1.3.33二.測試數據庫結構&#xff1a;-----start-----數據庫:test------------------…

數據庫系統的特點

數據結構化數據的共享性高&#xff0c;冗余度低且易擴充數據獨立性高數據由數據庫管理系統統一管理和控制

SNF軟件開發機器人-子系統-導出-導入功能-多人合作時這個功能經常用到

導出 導出可以將資源表和子系統導出并形成一個json文件。 1.效果展示&#xff1a; 2.使用說明&#xff1a; 點擊導出按鈕后會彈出一個導出頁面。頁面的左側可以選擇功能&#xff0c;右側可以選擇資源表&#xff0c;選擇功能的同時右側中功能所需的資源表也會被選擇。當功能之間…

基于物理的渲染-用真實的環境光照亮物體

目前&#xff0c;在游戲引擎中用于照亮物體的光源非常豐富。其中&#xff0c;比較常用的有&#xff1a;平行方向光、點光源、聚光燈以及體積光等&#xff0c;但它們都是對真實光源的近似&#xff0c;并不能很好地模擬真實世界中的復雜光照情況。為了增加光照效果的真實感&#…

php中取出數組中指定的值,PHP除開數組中指定的值

PHP去除數組中指定的值//一維數組簡單的做法 unset($arr[array_search($value,$arr)])$arr array("a","b","c","d");function isHave($var){if($var!"b")return true;}$arr_filter array_values(array_filter($arr,"…

實體以及實體型和實體集

實體&#xff08;Entity&#xff09; 客觀存在并可相互區別的事物稱為實體。 可以是具體的人、事、物或抽象的概念。 屬性&#xff08;Attribute&#xff09; 實體所具有的某一特性稱為屬性。 一個實體可以由若干個屬性來刻畫。 實體型&#xff08;Entity Type&#xf…

mysql中locat函數,MySQL中的LOCATE和POSITION函數使用方法 | 很文博客

不常用&#xff1a;MySQL中的LOCATE和POSITION函數LOCATE(substr,str)POSITION(substr IN str)返回子串 substr 在字符串 str 中第一次出現的位置。如果子串 substr 在 str 中不存在&#xff0c;返回值為 0&#xff1a;mysql> SELECT LOCATE(bar, ‘foobarbar);-> 4mysql…

什么是數據的完整性約束

為了防止不符合規范的數據進入數據庫&#xff0c;在用戶對數據進行插入、修改、刪除等操作時&#xff0c;DBMS自動按照一定的約束條件對數據進行監測&#xff0c;使不符合規范的數據不能進入數據庫&#xff0c;以確保數據庫中存儲的數據正確、有效、相容。

Python--協程(gevent模塊)

一&#xff1a;前言 協程又稱為微線程&#xff0c;纖程。英文名Coroutine:協程是一種用戶態的輕量級線程 協程擁有自己的寄存器上下文和棧。協程調度切換時&#xff0c;將寄存器上下文和棧保存到其他地方&#xff0c;在切回來的時候&#xff0c;恢復之前保存的寄存器上下文和…

ffmpeg 0.6.3 代碼, 經過我努力,能夠在vs 2005 下單步調試代碼

1. ffmpeg-0.6.3_modify.7z 是修改后的ffmepg的代碼&#xff1b; 2.ffmpeg-0.6.3_srouce.tar.bz2 是ffmpeg原始代碼&#xff1b; 3.SDL-devel-1.2.15-VC.zip 是圖像顯示使用使用的sdl代碼&#xff1b; 4.w_cc_p_10.1.020.exe 是vc 2005 需要使用的編譯器&#xff1b…

克隆CentOS6虛擬機eth0被修改為eth1如何修改eth0

2019獨角獸企業重金招聘Python工程師標準>>> 直接修改 /etc/sysconfig/network-script/ifcfg-eth0 刪掉UUID HWADDR 配置靜態地址 然后&#xff1a; rm -rf  /etc/udev/rules.d/70-persistent-net.rules然后reboot 轉載于:https://my.oschina.net/hengbao666/blog/…

[Hnoi2013]消毒

Description 最近在生物實驗室工作的小T遇到了大麻煩。 由于實驗室最近升級的緣故&#xff0c;他的分格實驗皿是一個長方體,其尺寸為abc&#xff0c;a、b、c 均為正整數。為了實驗的方便&#xff0c;它被劃分為abc個單位立方體區域&#xff0c;每個單位立方體尺寸 為111。用(i,…

php按照文件名字排序,php readdir 排序問題,如何按照日期進行排序

目前是這么寫的&#xff1a;function posts_get($directory,$ext){if (is_dir($directory)) {$handle opendir($directory);while ($file readdir($handle)){$subdir $directory . / .$file;if ($file ! . && $file !.. && is_dir($subdir)){posts_get($sub…

關系模型的名詞

關系&#xff08;Relation&#xff09;一個關系對應通常說的一張表元組&#xff08;Tuple&#xff09;表中的一行即為一個元組屬性&#xff08;Attribute&#xff09;表中的一列即為一個屬性&#xff0c;給每一個屬性起一個名稱即屬性名主碼&#xff08;Key&#xff09;也稱碼鍵…

物理卷、卷組、邏輯卷

參考文章&#xff1a; 相關文獻 謝謝作者分享!

fibonacci數列的題目——劍指Offer

https://www.nowcoder.net/practice/c6c7742f5ba7442aada113136ddea0c3?tpId13&tqId11160&tPage1&rp1&ru/ta/coding-interviews&qru/ta/coding-interviews/question-ranking 大家都知道斐波那契數列&#xff0c;現在要求輸入一個整數n&#xff0c;請你輸出…

如何高效的編寫與同步博客 (.NET Core 小工具實現)

系列目錄 [如何高效的編寫與同步博客&#xff08;一&#xff09;- 編寫 ]如何高效的編寫與同步博客&#xff08;二&#xff09;- 快速發布到多個渠道一.前言 寫博客&#xff0c;可以帶給我們很多好處&#xff0c;比如可以讓我們結識更多志同道合的人&#xff1b;在寫博客過程中…