多線程鎖,線程池,消費者生產者模型

?

?

鎖是怎么存在的?

在python建立之初,開發者目的是為了快速把語言開發出來,如果加上GIL(c語言加鎖),切換時按照100條字節指令來進行線程間的切換

?

為什么加鎖?

非線程安全,控制一段代碼

1.lock = threading.BoundedSemaphore
一次可以限制關卡,限制通行次數,不過這個是寫死的
 1 import time
 2 import threading
 3 lock = threading.BoundedSemaphore(3)#一次放三個(一次只通行三個)
 4 def func(arg):
 5     lock.acquire()
 6     time.sleep(1)
 7     print(arg)
 8     lock.release()
 9 for i in range(20):
10     t = threading.Thread(target=func, args=(i,))
11     t.start()

?

2.

lock = threading.Condition()
一次可以限制關卡,限制通行次數,不過這個是寫活的
可以自定義加載個數 ,只需在后面便利后加一個參數
lock.notify(inp) inp 來限制次數
 1 lock = threading.Condition()
 2 def func(arg):
 3     print('線程進來了')
 4     lock.acquire()
 5     lock.wait() # 加鎖這個特殊需要等待參數傳遞
 6     print(arg)
 7     time.sleep(1)
 8     lock.release()
 9 for i in range(10):
10     t =threading.Thread(target=func,args=(i,))
11     t.start()
12 while True:
13     inp = int(input('>>>'))
14     lock.acquire()
15     lock.notify(inp)#加的控制次數的 這個是特殊的
16     lock.release()

?

3.

lock = threading.Event()  獲取全部
注意.獲取全部使用 lock.wait() 加鎖的
input(">>>>") 是用來控制是否全部獲取的一個開關,一旦輸入 ,解鎖會獲取全部  后面需要加入 lock.set() 綠燈
如果想再次使用這個函數, lock.clear() 重新清空
 1 import time
 2 import threading
 3 
 4 lock = threading.Event()
 5 
 6 def func(arg):
 7     print('線程來了')
 8     lock.wait() # 加鎖:紅燈
 9     print(arg)
10 for i in range(10):
11     t =threading.Thread(target=func,args=(i,))
12     t.start()
13 input(">>>>")
14 lock.set() # 綠燈
15 lock.clear() # 再次變紅燈
16 for i in range(10):
17     t =threading.Thread(target=func,args=(i,))
18     t.start()
19 input(">>>>")
20 lock.set()

4.

 v = threading.local()#內部創建一個屬于自己的值 phone=arg 為了區分自己拿的包

?

 1 import time
 2 import threading
 3 v = threading.local()
 4 def func(arg):
 5     # 內部會為當前線程創建一個空間用于存儲:phone=自己的值
 6     v.phone = arg
 7     time.sleep(2)
 8     print(v.phone,arg) # 去當前線程自己空間取值
 9 for i in range(10):
10     t =threading.Thread(target=func,args=(i,))
11     t.start()

?

?

?

?

?

?

?

?

線程池: 用來約束每次輸出的次數,不是全部哪出啊,可以限制一次拿出幾個

1 from concurrent.futures import ThreadPoolExecutor
2 import  time
3 def func(a1,a2):
4     time.sleep(5)
5     print(a1,a2)
6 a=ThreadPoolExecutor(4)#實例化對象讓其限制次數 
7 for i  in  range(40):
8     a.submit(func,i,15)

生產者,消費者模型

這種模型在多線程中屬于按順序使用 ?現有生產才有消費,這個是一個固定順序,而在函數中,為了更明確這種概念而不考慮生產時間限制

來更符合邏輯性 出現了queue 模塊 ?首先實例化對象 ?q=queue.Queue 在用方法q.put(" ") 括號里面必須有字符串提示從這里入,符合隊列(先進先出)而拋開邏輯

后面用q.get( ) 方法提示出來了

 1 import time
 2 import threading
 3 import queue
 4 q=queue.Queue()#實例化對象
 5 def mk(id):
 6     while 1:
 7         time.sleep(3)
 8         q.put("布加迪")#首先進入q.put
 9         print("師傅%s 生產了一個布加迪"% id)
10 for i  in  range(1,3):
11     t=threading.Thread(target=mk,args=(i,))
12     t.start()
13 def et(id):
14     while 1:
15         time.sleep(1)
16         v1=q.get()#然后沖進去
17         print("連達%s 吃了一個布加迪"% id)
18 for i  in  range(1,6):
19     t1=threading.Thread(target=et,args=(i,))
20     t1.start()

?

轉載于:https://www.cnblogs.com/zhangqing979797/p/9628884.html

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

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

相關文章

【2022】多線程并發編程面試真題

文章目錄4. 多線程4.1 創建線程有哪幾種方式?4.2 說說Thread類的常用方法4.3 run()和start()有什么區別?4.4 線程是否可以重復啟動,會有什么后果?4.5 介紹一下線程的生命周期4.6 如何實現線程同步?4.7 說一說Java多線程…

蘋果面試8大難題及答案

摘要:蘋果這樣的公司通常會在面試過程中向求職者拋出一些邏輯的問題來考研面試者,所以,如果你對進入蘋果感興趣,或者向往類似的公司,又或者只是對邏輯問題感興趣,這些面試難題值得你仔細研究。 導讀&#x…

idea自動導入jar包的快捷鍵

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 見:http://blog.csdn.net/u014771464/article/details/52330254 altenter(光標緊跟在類的后面)

ROS系統玩轉自主移動機器人(3)-- 開源機器人結構介紹

ROS系統玩轉自主移動機器人(3)-- 開源機器人結構介紹 本機器人機械結構設計相關的所有設計文件下載地址為:傳送門 其中包含:三維造型設計文件(所有零件裝配效果)(tips:基于Solidwork…

【2022】JVM常見面試真題詳解

文章目錄5. JVM5.1 JVM包含哪幾部分?5.2 JVM是如何運行的?5.3 Java程序是怎么運行的?5.4 本地方法棧有什么用?5.5 沒有程序計數器會怎么樣?5.6 說一說Java的內存分布情況5.7 類存放在哪里?5.8 局部變量存放…

Linux 基本操作--文件查看 (day3)

一、查看文件-----cat (詳情參考:http://blog.sina.com.cn/s/blog_52f6ead0010127xm.html) 語法結構: cat 查看方式 文件 cat -A : show all 顯示所有內容,相當于-vET [rootlocalhost tmp]# cat -A /etc/profile #注釋:查看/erx/目錄下profile文件的內容 cat -b  :對非空…

如何在面試時寫出高質量的代碼

摘要:有些程序員由于平時沒有養成良好的編程習慣,在面試時寫出的代碼質量不高,最終遺憾地與心儀的公司和職位失之交臂。如何在面試時能寫出高質量的代碼,是很多程序員關心的問題。 程序員在職業生涯中難免要接受編程面試。有些程序…

IntelliJ IDEA添加jar包

見:http://blog.csdn.net/a153375250/article/details/50851049 以JDBC-MySQL驅動包為例 1、在IntelliJ IDEA中打開要添加jar包的Project 2、File – Project Structure如下圖 3、選擇Moudules – 再選擇Dependencies如下圖 4、選中Moudule source – 然后點擊2處號…

Python3 與 C# 并發編程之~ 進程篇

上次說了很多Linux下進程相關知識,這邊不再復述,下面來說說Python的并發編程,如有錯誤歡迎提出~ 如果遇到聽不懂的可以看上一次的文章:https://www.cnblogs.com/dotnetcrazy/p/9363810.html 官方文檔:https…

11月12號 用戶登錄輸入密碼錯誤達到指定次數后,鎖定賬戶 004

用戶表里添加兩個屬性 連續密碼輸錯次數private Integer loginFailCount;/** 登錄失敗禁用時間 */ private Date missDate; / 如果登錄錯誤次數大于5次 規定時間內禁止登錄if(dbUser.getLoginFailCount() ! null && dbUser.getLoginFailCount() > 3){if(DateUtils.…

Goobuntu:谷歌的內部桌面系統

摘要:大多數Linux用戶都知道Google用Linux作為它們的桌面和服務器端操作系統,有的人可能還知道Google選擇的是定制的Ubuntu——Goobuntu,但在此之前幾乎沒有Google外部人員了解他們究竟是如何使用Ubuntu的,8月29日,Tho…

Springboot 之 Hibernate自動建表(Mysql)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 引入Maven依賴包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-…

Spring全家桶面試真題

文章目錄1. Spring Boot1.1 說說你對Spring Boot的理解1.2 Spring Boot Starter有什么用&#xff1f;1.3 介紹Spring Boot的啟動流程1.4 Spring Boot項目是如何導入包的&#xff1f;1.5 請描述Spring Boot自動裝配的過程1.6 說說你對Spring Boot注解的了解2. Spring2.1 請你說說…

WSDL測試webservice接口記錄

收到一個事情&#xff0c;需要對接第三方API&#xff0c;對方給了個service&#xff0c;看了一下&#xff0c;原來是webservices的。 上一次測試webervice的接口&#xff0c;還是至少八九年前的時候了&#xff0c;這種相對比較老舊的也好久不在使用。 于是&#xff0c;簡單搞了…

idea窗口下方滾動條不明顯設置

在使用idea時&#xff0c;下方的滾動條老是顯示不明顯&#xff0c;每次點擊拖拽都很費勁&#xff0c;在網上找了很多相關設置&#xff0c;最后確定了一個最好的辦法解決問題&#xff1a; Shift &#xff08;上檔&#xff09; 鼠標滾動&#xff0c;這樣就可以橫向翻滾了&#…

把握本質規律——《數學之美》作者吳軍

無論是互聯網&#xff0c;還是手機、電視&#xff0c;現代通信都遵循信息論的規律&#xff0c;整個信息論的基礎都是數學。搜索引擎、語音識別、機器翻譯也都是我們生活中離不開的技術&#xff0c;數學也是解決這些問題的最好工具。在《浪潮之巔》出版后&#xff0c;吳軍將蘊含…

Hibernate4 注解方法說明

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.類級別注解 Entity 映射實體類 Table 映射數句庫表 Entity(name"tableName") - 必須&#xff0c;注解將一個類聲明…

消息隊列常見面試題

文章目錄2. 消息隊列2.1 MQ有什么用&#xff1f;2.2 說一說生產者與消費者模式2.3 消息隊列如何保證順序消費&#xff1f;2.4 消息隊列如何保證消息不丟&#xff1f;2.5 消息隊列如何保證不重復消費&#xff1f;2.6 MQ處理消息失敗了怎么辦&#xff1f;2.7 請介紹消息隊列推和拉…

Mybatis 詳解--- 一級緩存、二級緩存

2019獨角獸企業重金招聘Python工程師標準>>> Mybatis 為我們提供了一級緩存和二級緩存&#xff0c;可以通過下圖來理解&#xff1a; ①、一級緩存是SqlSession級別的緩存。在操作數據庫時需要構造sqlSession對象&#xff0c;在對象中有一個數據結構&#xff08;Hash…

我的nabcd

我們組要做的軟件是一款MP3播放軟件&#xff0c;名字叫TDG音樂 N&#xff08;need需求&#xff09;&#xff0c;由于現在版權越來越被重視&#xff0c;許多播放軟件里面的大部分歌曲都是收費的&#xff0c;不想花錢又想聽可怎么辦呢&#xff0c;只能在網上找免費資源&#xff0…