python使用多線程寫生成器_Python學習——多線程,異步IO,生成器,協程

Python的語法是簡潔的,也是難理解的。

比如yield關鍵字:

def fun():

for i in range(5):

print('test')

x = yield i

print('good', x)

if __name__ == '__main__':

a = fun()

# print(a.__next__())

# print(a.__next__())

# print(a.__next__())

y = a.send(None)

y = a.send(-1)

y = a.send(-2)

#print(y)

凡是包含yield關鍵字的函數都不再是一個函數,而成為一個生成器(或迭代器,Generator)

Generator包含一個棧幀(Stack Frame),它維護Generator自身的執行狀態,即便生成器的執行被暫停而返回到母程序中,下一次依然能恢復Generator的上一次的狀態,從一個yield執行到下一個yield語句前。這就是生成器的執行方式。

迭代一個執行器可以使用send方法,也可以使用__next__方法,send方法能給Generator傳遞即時的數據,同時接收Generator內部執行狀態,這個過程就是協程通信的基礎。

而__next__方法只能從Generator接收內部執行狀態,而無法向Generator中傳入信息,所以__next__不能完成通信,因為通信不能是單向的。

__next__調用下的Generator只是一個迭代器而已。而send調用下的Generator卻升級成為一個協程(Co-routine)

使用協程Coroutine的目的是為了避免將業務邏輯的實現混在異步IO的回調函數中,使得程序可讀性提升而已。

Python中異步IO采用selectors,它支持了各個操作系統的異步IO的事件管理機制(Linux是epoll),通過selectors.DefaultSelector來實現事件與回調函數的綁定。可以將線程內CPU等待IO的時間轉移到操作系統上。畢竟和IO設備交互的不是應用程序,而是操作系統。

多線程:

import threading, time

global n

class MyThread(threading.Thread):

def __init__(self):

threading.Thread.__init__(self)

def run(self):

global n, lock

time.sleep(1)

if lock.acquire():

print(n)

print(self.name)

n += 1

lock.release()

if __name__ == '__main__':

n = 1

ThreadList = []

lock = threading.Lock()

for i in range(1, 200):

t = MyThread()

ThreadList.append(t)

for t in ThreadList:

t.start()

for t in ThreadList:

t.join()

多線程簡單,需要注意的就是鎖。資源的訪問在鎖中進行時,鎖才會起作用,因此這個鎖類似于獨立于線程的原子性對象,所有線程都在這個鎖上變得有序起來,離開鎖重歸無序競爭狀態。

因此資源無所謂唯一性和不可同時操作性,只有鎖自身具備這種性質。所有的資源的同步都是靠代碼的約束——將和資源相關的操作和鎖綁定在一起才能實現的。多線程在一般設備上效率不遜于協程(單線程內通過操作系統OS進行執行順序的切換)。

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

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

相關文章

Python與C++結構體交互

需求:根據接口規范,實現與服務端的數據交互 服務端結構體分包頭、包體、包尾 包頭C結構體示例如下 1 typedef struct head2 {3 BYTE string1;4 BYTE string2; //包類型5 BYTE string3; //版本號,目前為06 char s…

Ubuntu下安裝OpenSSH Server并在客戶端遠程連接Ubuntu

本文主要是向讀者介紹了如何在Ubuntu系統下安裝OpenSSH Server并在客戶端遠程連接Ubuntu,共有兩種方法,一種是命令行安裝;另一種是通過Ubuntu Software Center安裝,希望對大家能有幫助! 方法一(推薦&#…

算法:老鼠走迷宮問題

算法:老鼠走迷宮問題(初) 【寫在前面】 老鼠走迷宮問題的遞歸實現,是對遞歸思想的一種應用。 【問題描述】 給定一個二維數組,數組中2表示墻壁,0表示通路,由此數組可展示為一個迷宮圖。給定入口位置和出口位置&#xf…

rust python對比_Python Rust 迭代器對比

迭代是數據處理的基石,而 Python 中所有集合都可以迭代,這是 Python 讓使用者感到非常方便的特征之一。下面是一些在 Python 中經常使用的迭代模式# 列表for i in [1, 2, 3, 4]:print(i)# 字典di {a: 1, b: 2, c: 3}# 迭代鍵for k in di.keys():print(k…

WebSphere Application Server性能調整工具包

IBM已發布了WebSphere Application Server性能調整工具包 ,該工具包具有從Eclipse工作區*監視多個 WebSphere Application Server的功能。 該工具使用WAS Performance Monitoring統計信息來獲取并繪制圖表,以指示服務器的運行狀況。 *請注意,…

CentOS 配置防火墻操作實例(啟、停、開、閉端口)

CentOS 配置防火墻操作實例&#xff08;啟、停、開、閉端口&#xff09;&#xff1a; 注&#xff1a;防火墻的基本操作命令&#xff1a; 查詢防火墻狀態: [rootlocalhost ~]# service iptables status<回車> 停止防火墻: [rootlocalhost ~]# service iptables stop &…

linux常用命令-壓縮解壓命令

壓縮解壓命令 目錄 1. 壓縮解壓命令&#xff1a;gzip 2. 壓縮解壓命令&#xff1a;gunzip 3. 壓縮解壓命令&#xff1a;tar 4. 壓縮解壓命令&#xff1a;zip 5. 壓縮解壓命令&#xff1a;unzip 6. 壓縮解壓命令&#xff1a;bzip2 7. 壓縮解壓命令&#xff1a;bunzip2 1. 壓縮解…

達夢數據庫查詢數據庫所有表名_達夢數據庫的一些實用小SQL

1)當前數據庫中的模式名&#xff1a;select distinct object_name TABLE_SCHEMA from all_objects where object_type SCH;2)查出各模式對應的用戶&#xff1a;selectSCH_OBJ.NAME ,SCH_OBJ.ID ,SCH_OBJ.CRTDATE,USER_OBJ.NAMEfrom(select NAME, ID, PID, CRTDATE from …

設置Java EE 6開發環境

本教程簡要說明了如何設置典型的環境來開發基于Java EE 6的應用程序。 除了可以正常工作的Windows XP客戶端具有足夠的CPU能力和內存外&#xff0c;本教程沒有其他先決條件。 在教程中&#xff0c;我們將需要安裝以下組件&#xff1a; Java 6 JDK更新26 用于Java EE開發人員的…

css cursor url用法格式詳解

css cursor url用法格式&#xff1a;css:{cursor:url(圖標路徑),auto;} //IE,FF,chrome瀏覽器都可以 實例代碼&#xff1a;html{cursor: url("http://ued.taobao.com/blog/wp-content/themes/taobaoued/images/cursor.ico"),auto;} 解析&#xff1a;前面的url是自定義…

iostext添加點擊事件_iOS開發小技巧 - label中的文字添加點擊事件

Label中的文字添加點擊事件以前老師講過類似的功能,自己懶得回頭看了,找了很多第三方的,感覺這個小巧便利,作者只是擴展了分類,實現起來代碼也少.先來個效果圖自己的項目,直接上代碼- (void)setTopicModel:(CYQTopicModel *)topicModel{_topicModel topicModel;NSArray *likeA…

ubantu下安裝Nginx

Nginx 概述 Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 服務器&#xff0c;也是一個 IMAP/POP3/SMTP 代理服務器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的&#xff0c;第一個公開版本0.1.0發布于2004年10月4日。其將源代碼…

Hadoop中的問題–何時無法交付?

Hadoop是很棒的軟件。 它不是原始的&#xff0c;但肯定不能消除它的榮耀。 它建立在并行處理的基礎上&#xff0c;這個概念已經存在了數十年。 Hadoop雖然從概念上來說并不是獨創性的&#xff0c;但它顯示了自由開放的力量&#xff08;就像在啤酒中一樣&#xff01;&#xff09…

創建 dblink

目的&#xff1a;oracle中跨數據庫查詢 兩臺數據庫服務器db_A(本地)和db_B(遠程192.168.1.100)&#xff0c;db_A下用戶user_a 需要訪問到db_B下user_b的數據解決&#xff1a;查詢得知使用dblink(即database link 數據庫鏈)實現過程&#xff1a;1、確定用戶user_a有沒有創…

C#靜態常量和動態常量的區別

C#擁有兩種不同的常量&#xff1a;靜態常量(compile-time constants)和動態常量(runtime constants)。它們有不同的特性&#xff0c;錯誤的使用不僅會損失效率&#xff0c;還可能造成錯誤。相比之下&#xff0c;靜態常量在速度上會稍稍快一些&#xff0c;但是靈活性卻比動態常…

spring的鉤子_高級java開發必須掌握的Spring接口——SmartLifecycle

有些場景我們需要在Spring 所有的bean 完成初始化后緊接著執行一些任務或者啟動需要的異步服務。 常見有幾種解決方案j2ee 注解 啟動前PostConstruct 銷毀前PreDestroy 基于j2ee 規范springboot 的 org.springframework.boot.CommandLineRunner springboot 特性前面我已經介紹過…

Java:對Java SE 6和Java SE 7的客戶端和桌面部分的改進!

Java 6和Java 7中的客戶端改進 了解有關Java SE 6和Java SE 7的客戶端和桌面部分的改進&#xff0c;包括新的applet插件&#xff0c;Java Deployment Toolkit&#xff0c;成形和半透明的窗口&#xff0c;重量級-輕量級混合以及Java Web Start。 介紹 自2006年12月發布Java平臺…

辨異 —— 行星 vs 恒星

star&#xff1a;恒星&#xff0c;planet&#xff1a;行星&#xff1b;1. 恒星 恒星是指宇宙中靠核聚變產生的能量而自身能發熱發光的星體&#xff08;比如太陽&#xff09;。過去天文學家以為恒星的位置是永恒不變的&#xff0c;以此為名。但事實上&#xff0c;恒星也會按照一…

軟件公司職責分配

崗位&#xff1a;項目經理 主要職責&#xff1a;1、 計劃&#xff1a;a)項目范圍、項目質量、項目時間、項目成本的確認。b)項目過程/活動的標準化、規范化。c)根據項目范圍、質量、時間與成本的綜合因素的考慮&#xff0c;進行項目的總體規劃與階段計劃。d)各項計劃得到上級領…

大型網站架構系列:負載均衡詳解(4)

本文是負載均衡詳解的第四篇&#xff0c;主要介紹了LVS的三種請求轉發模式和八種負載均衡算法&#xff0c;以及Haproxy的特點和負載均衡算法。具體參考文章&#xff0c;詳見最后的鏈接。 三、LVS負載均衡 LVS是一個開源的軟件&#xff0c;由畢業于國防科技大學的章文嵩博士于19…