搜索
首页后端开发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
Python与C:学习曲线和易用性Python与C:学习曲线和易用性Apr 19, 2025 am 12:20 AM

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

Python vs. C:内存管理和控制Python vs. C:内存管理和控制Apr 19, 2025 am 12:17 AM

Python和C 在内存管理和控制方面的差异显着。 1.Python使用自动内存管理,基于引用计数和垃圾回收,简化了程序员的工作。 2.C 则要求手动管理内存,提供更多控制权但增加了复杂性和出错风险。选择哪种语言应基于项目需求和团队技术栈。

科学计算的Python:详细的外观科学计算的Python:详细的外观Apr 19, 2025 am 12:15 AM

Python在科学计算中的应用包括数据分析、机器学习、数值模拟和可视化。1.Numpy提供高效的多维数组和数学函数。2.SciPy扩展Numpy功能,提供优化和线性代数工具。3.Pandas用于数据处理和分析。4.Matplotlib用于生成各种图表和可视化结果。

Python和C:找到合适的工具Python和C:找到合适的工具Apr 19, 2025 am 12:04 AM

选择Python还是C 取决于项目需求:1)Python适合快速开发、数据科学和脚本编写,因其简洁语法和丰富库;2)C 适用于需要高性能和底层控制的场景,如系统编程和游戏开发,因其编译型和手动内存管理。

数据科学和机器学习的Python数据科学和机器学习的PythonApr 19, 2025 am 12:02 AM

Python在数据科学和机器学习中的应用广泛,主要依赖于其简洁性和强大的库生态系统。1)Pandas用于数据处理和分析,2)Numpy提供高效的数值计算,3)Scikit-learn用于机器学习模型构建和优化,这些库让Python成为数据科学和机器学习的理想工具。

学习Python:2小时的每日学习是否足够?学习Python:2小时的每日学习是否足够?Apr 18, 2025 am 12:22 AM

每天学习Python两个小时是否足够?这取决于你的目标和学习方法。1)制定清晰的学习计划,2)选择合适的学习资源和方法,3)动手实践和复习巩固,可以在这段时间内逐步掌握Python的基本知识和高级功能。

Web开发的Python:关键应用程序Web开发的Python:关键应用程序Apr 18, 2025 am 12:20 AM

Python在Web开发中的关键应用包括使用Django和Flask框架、API开发、数据分析与可视化、机器学习与AI、以及性能优化。1.Django和Flask框架:Django适合快速开发复杂应用,Flask适用于小型或高度自定义项目。2.API开发:使用Flask或DjangoRESTFramework构建RESTfulAPI。3.数据分析与可视化:利用Python处理数据并通过Web界面展示。4.机器学习与AI:Python用于构建智能Web应用。5.性能优化:通过异步编程、缓存和代码优

Python vs.C:探索性能和效率Python vs.C:探索性能和效率Apr 18, 2025 am 12:20 AM

Python在开发效率上优于C ,但C 在执行性能上更高。1.Python的简洁语法和丰富库提高开发效率。2.C 的编译型特性和硬件控制提升执行性能。选择时需根据项目需求权衡开发速度与执行效率。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。