首頁 後端開發 Python教學 python學習日記----線程,Event,隊列

python學習日記----線程,Event,隊列

Jun 23, 2017 am 11:05 AM
python 一天 執行緒

进程与线程的区别:

线程==指令集,进程==资源集  (线程集)

1、同一个进程中的线程共享内存空间,进程与进程之间是独立的

2、同一个进程中的线程是可以直接通讯交流的,进程与间通讯必需通过一个中间的代理才能实现

3、创建线程简单,创建进程,是克隆父进程 

4、一个线程可以控制和操作同一进程里的其他线程,但进程只能操作子进程

5、线程启动速度快,进程启动速度比较慢

线程示例:

 1 import time ,threading 2  3 def run(attr): 4     print('输出:',attr) 5     time.sleep(3) 6  7  8 t1=threading.Thread(target=run,args=('第一个线程',)) 9 t2=threading.Thread(target=run,args=('第二个线程',))10 11 t1.start()#启动线程112 t2.start()#启动线程2
登入後複製
1 def run2(attr):2     print('输出:',attr)3     time.sleep(3)4 5 run2('第一个线程')6 run2('第二个线程')7 #以上转为串联执行
登入後複製

 

继承线程 类写线程

 1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4  5 import threading,time 6  7 class thre(threading.Thread):#继承线程中的类 8     def __init__(self,n,times): 9         super(thre,self).__init__()10         self.n=n11         self.teims=times12     def run(self):13         print('执行第一线程:',self.n)14         time.sleep(self.teims)15 16 star_time=time.time()17 t1=thre('第一线程',3)18 t2=thre('第二线程',4)19 t1.start()20 t2.start()21 t1.join()#join等待该线程执行完成22 23 t2.join()24 den_time=time.time()-star_time25 print(den_time)
登入後複製

 

 

等待线程执行完成,用.join

 1 import time ,threading 2 lock=threading.Lock()#定义一个线程锁变量 3 def run(attr): 4     lock.acquire()#申请一个线程锁 5     global num 6     print('输出:',attr) 7     #time.sleep(3) 8     num+=1 9     lock.release()#释放线程锁10     time.sleep(3)11     print('输出完成'.center(10,'〓'))12 star_time=time.time()#开始时间13 14 num=015 re_lilst=[]#定义一个列表16 for i in range(50):17     t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程18     #t1.setDaemon(True)#设置为守护进程 当主线程完成,守护也停止19     t1.start()#起动线程20     re_lilst.append(t1)#不用JOIN,避免阻塞为串行21 22 print(threading.current_thread(),threading.active_count())#查看线程 的主 子  活跃线程23     #print('分线程'.center(40,'☆'))24 print('数字:',num)25 for i in re_lilst:#等待线程 完成26     i.join()27 print('数字:',num)28 print('主线程'.center(60,'◇'),threading.current_thread(),threading.active_count())29 30 den_time=time.time()-star_time#总共时间31 print(den_time)
登入後複製
View Code

守护进程,相当于主进程的下属,当主进程结束,无论守护进程内的是否执行完成,都会停止!

 1 import time ,threading 2 lock=threading.Lock()#定义一个线程锁变量 3 def run(attr): 4     lock.acquire()#申请一个线程锁 5     global num 6     print('输出:',attr) 7  8     #time.sleep(3) 9     num+=110     lock.release()#释放线程锁11     time.sleep(3)12     print('输出完成'.center(10,'〓'))13 14 star_time=time.time()#开始时间15 16 num=017 re_lilst=[]#定义一个列表18 for i in range(50):19     t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程20     t1.setDaemon(True)#设置为守护进程 当主线程完成,守护也停止21     t1.start()#起动线程22     re_lilst.append(t1)#不用JOIN,避免阻塞为串行23 24 print(threading.current_thread(),threading.active_count())#查看线程 的主 子  活跃线程25     #print('分线程'.center(40,'☆'))26 print('数字:',num)27 # for i in re_lilst:#等待线程 完成28 #    i.join()29 print('数字:',num)30 print('主线程'.center(60,'◇'),threading.current_thread(),threading.active_count())31 32 den_time=time.time()-star_time#总共时间33 print(den_time)
登入後複製
View Code

线程锁,在py3中可以不使用:

lock=threading.Lock()

lock.acquire()

递归锁  用于递归线程

 1 import time ,threading 2  3 def run(i): 4     print('输出:-------',i) 5     lock.acquire()#申请锁 6     global num1 7     num1+=1 8     time.sleep(0.1) 9     lock.release()#释放锁10     return num111 12 def run2(i):13     lock.acquire()#申请锁14     global num215     print('输出:22',i)16     num2+=117     time.sleep(0.1)18     lock.release()#释放锁19     return num220 21 def run3(i):22     lock.acquire()#申请锁23     res=run(i)24     print('输出:333',i)25     res2=run2(i)26     time.sleep(0.1)27     print(res,res2)28     lock.release()#释放锁29 30 31 if __name__ == '__main__':32     star_time=time.time()#开始时间\33     num1,num2=0,034     #lock=threading.Lock()#定义一个线程锁,如是线程锁,递归时会出错35     lock=threading.RLock()#定义一个递归锁36 37     for i in range(10):38         #t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程39         t1=threading.Thread(target=run3,args=(('第%s线程'%i),))#新建线程40         t1.start()#起动线程41 42     else:43         print('活跃线程数:',threading.active_count())#查看线程 活跃线程数44 45 46 while threading.active_count()!=1:#不只一个线程,就是说,判断是否是剩下主线程47     #print(threading.active_count())#查看线程 活跃线程数48     pass49 else:50     print('主线程:pid,活跃线程数'.center(60,'◇'),threading.current_thread(),threading.active_count())#51     den_time=time.time()-star_time#总共时间52     print(den_time)53     print(num1,num2)
登入後複製
View Code

信号量  相当与 多个线程锁 

 1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4  5 #!usr/bin/env python 6 #-*-coding:utf-8-*- 7 # Author calmyan 8 import time ,threading 9 10 def run(attr):11     semaphore.acquire()#申请信号量线程锁12     global num13     print('输出:',attr)14     time.sleep(1)15     semaphore.release()#释放信号量线程锁16 17 star_time=time.time()#开始时间18 if __name__ == '__main__':19 20     semaphore=threading.BoundedSemaphore(4)#信号量 最多允许几个线程同时运行(多把锁)21     for i in range(50):22         t1=threading.Thread(target=run,args=(('第%s线程'%i),))#新建线程23         t1.start()#起动线程24 25 while threading.active_count()!=1:#不只一个线程,就是说,判断是否是剩下主线程26     pass27 else:28     print('主线程'.center(60,'◇'),threading.current_thread(),threading.active_count())29     den_time=time.time()-star_time#总共时间30     print(den_time)
登入後複製
View Code

Event 线程标志

红绿灯示例

 1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4  5 import threading,time 6  7 event=threading.Event()#生成一个标示位对象 8 def lighter():# 9     count=0 #定义时间秒数10     event.set()#设置标志位11     while True:12         if count>9 and count<15:#设定为红灯13             event.clear()#清除标志位,14             print(&#39;\033[41;1m变为红灯!\033[0m&#39;)15         elif count>=15 and count<18 :#为黄灯16 17             print(&#39;\033[43;1m变为黄灯!\033[0m&#39;)18         elif count>=18:19             event.set()#设置标志位20             print('\033[42;1m变为绿灯!\033[0m')21             count=0#重新计时22         else:23             print('\033[42;1m绿灯中.....!\033[0m')24         time.sleep(1)25         count+=1#每一秒钟加一次26 27 28 def car(name):29     while True:30         if event.is_set():#如果有标志 说明为绿灯31             print('[%s]在行驶中....'%name)32             time.sleep(1)33         else:34             print('[%s]在等待中.....'%name)35             event.wait()#等待获取标志36             print('绿灯亮了,[%s]继续行驶...'%name)37             time.sleep(1)38 39 40 light=threading.Thread(target=lighter,)#定义一个线程41 light.start()#启动线程42 43 car1=threading.Thread(target=car,args=('红旗轿车',))#生成一个汽车线程44 car1.start()
登入後複製
View Code

 

队列  生产者消费者模型

 

 1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4  5 #队列 生产者消费者模型 6  7 import threading,time,queue 8  9 q=queue.Queue()#创建一个队列10 11 def produ(name):#生产函数12     count=013     while True:14         bz=name+str(count)15         q.put(bz)16         print('[%s]生产了,第[%s]个[%s]g 包子'%(name,count,bz))17         count+=118         time.sleep(1.5)19 20 def consump(name):#消费者21     while True:22         i=q.get()#取23         print('[%s]拿到包子[%s],并吃了'%(name,i))24         time.sleep(0.5)25 26 27 p1=threading.Thread(target=produ,args=('王五包子铺',))#创建一个新线程 生产者28 p2=threading.Thread(target=produ,args=('麻子六包子铺',))#创建一个新线程 生产者29 r1=threading.Thread(target=consump,args=('张三',))#创建一个新线程 消费者30 r2=threading.Thread(target=consump,args=('李四',))#创建一个新线程 消费者31 p1.start()32 p2.start()33 r1.start()34 r2.start()
登入後複製
View Code

 

以上是python學習日記----線程,Event,隊列的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1656
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1229
24
PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

sublime怎麼運行代碼python sublime怎麼運行代碼python Apr 16, 2025 am 08:48 AM

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

vs code 可以在 Windows 8 中運行嗎 vs code 可以在 Windows 8 中運行嗎 Apr 15, 2025 pm 07:24 PM

VS Code可以在Windows 8上運行,但體驗可能不佳。首先確保系統已更新到最新補丁,然後下載與系統架構匹配的VS Code安裝包,按照提示安裝。安裝後,注意某些擴展程序可能與Windows 8不兼容,需要尋找替代擴展或在虛擬機中使用更新的Windows系統。安裝必要的擴展,檢查是否正常工作。儘管VS Code在Windows 8上可行,但建議升級到更新的Windows系統以獲得更好的開發體驗和安全保障。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

notepad 怎麼運行python notepad 怎麼運行python Apr 16, 2025 pm 07:33 PM

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

See all articles