版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、线程访问全局变量import threadingg_num = 0def test(n): global g_num for x in range(n): g_num += x g_num -= x print(g_num)if _name_ = _main_: t1 = threading.Thread(target=test, args=(10,) t2 = threading.Thread(target=test, args=(10,) t1.start() t2.start()在一个进程内的所有线程共享全局变量,很方便在多个线程间共享数据。缺点就是,线程是对全局变量随意遂改可能造成多线
2、程之间对全局变量的混乱(即线程非安全)。线程的安全问题import threadingimport timeticket = 20def sell_ticket(): global ticket while True: if ticket 0: time.sleep(0.5) ticket -= 1 print(卖了一张票,还剩.format(threading.current_thread().name, ticket) else: print(票卖完了.format(threading.current_thread().name) breakfor i in range(5): t = t
3、hreading.Thread(target=sell_ticket, name=thread-.format(i + 1) t.start()同步当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制。同步就是协同步调,按预定的先后次序进行运行。线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。互斥锁互斥锁为资源引入一个状态:锁定/非锁定某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的
4、正确性。threading模块中定义了Lock类,可以方便的处理锁定:# 创建锁mutex = threading.Lock()# 锁定mutex.acquire()# 释放mutex.release()注意:如果这个锁之前是没有上锁的,那么acquire不会堵塞如果在调用acquire对这个锁上锁之前 它已经被 其他线程上了锁,那么此时acquire会堵塞,直到这个锁被解锁为止。和文件操作一样,Lock也可以使用with语句快速的实现打开和关闭操作。使用互斥锁解决卖票问题import threadingimport timeticket = 20lock = threading.Lock()
5、def sell_ticket(): global ticket while True: lock.acquire() if ticket 0: time.sleep(0.5) ticket -= 1 lock.release() print(卖了一张票,还剩.format(threading.current_thread().name, ticket) else: print(票卖完了.format(threading.current_thread().name) lock.release() breakfor i in range(5): t = threading.Thread(targ
6、et=sell_ticket, name=thread-.format(i + 1) t.start()上锁过程:当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“阻塞”,直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。总结锁的好处:确保了某段关键代码只能由一个线程从头到尾完整地执行锁的坏处:阻止了多线程并发执行,包含锁
7、的某段代码实际上只能以单线程模式执行,效率就大大地下降了。由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁。线程间通信线程之间有时需要通信,操作系统提供了很多机制来实现进程间的通信,其中我们使用最多的是队列Queue.Queue的原理Queue是一个先进先出(First In First Out)的队列,主进程中创建一个Queue对象,并作为参数传入子进程,两者之间通过put( )放入数据,通过get( )取出数据,执行了get( )函数之后队列中的数据会被同时删除,可以使用multiprocessing模块的Queue实现多进程之间的数据传递。import
8、 threadingimport timefrom queue import Queuedef producer(queue): for i in range(100): print(存入了.format(threading.current_thread().name, i) queue.put(i) time.sleep(0.1) returndef consumer(queue): for x in range(100): value = queue.get() print(取到了.format(threading.current_thread().name, value) time.sl
9、eep(0.1) if not value: returnif _name_ = _main_: queue = Queue() t1 = threading.Thread(target=producer, args=(queue,) t2 = threading.Thread(target=consumer, args=(queue,) t3 = threading.Thread(target=consumer, args=(queue,) t4 = threading.Thread(target=consumer, args=(queue,) t6 = threading.Thread(t
10、arget=consumer, args=(queue,) t1.start() t2.start() t3.start() t4.start() t6.start()多线程版聊天import socketimport threadings = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.bind(, 8080)def send_msg(): ip = input(请输入您要聊天的ip:) port = int(input(请输入对方的端口号:) while True: msg = input(请输入聊天内容:) s.sendto(msg.encode(utf-8), (ip, port) if msg = bye: ip = input(请输入您要聊天的ip:) port = int(input(请输入对方的端口号:)def recv_msg(): while True: content, addr = s.recvfrom(1024) print(接收到了主机端口的消息:.format(addr0, addr1, content.decode(utf-8),file
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 9364.5-2025小型熔断器第5部分:小型熔断体质量评定导则
- 化工催化技术课件
- 化工仿真培训实操课件
- 飞秒技术科普
- 2026年人力资源管理师绩效考核体系设计知识练习(含答案解析)
- 2026云南保山市腾冲市边防办招聘边境专职联防员备考考试题库及答案解析
- 2026年青岛市即墨区部分事业单位公开招聘工作人员(53人)笔试备考试题及答案解析
- 2026云南嘉华食品有限公司招聘备考考试题库及答案解析
- 别墅搭架施工方案(3篇)
- 标识制作施工方案(3篇)
- 柴油维修技术培训课件
- 安全附件管理制度规范
- 2026院感知识考试题及答案
- 《红楼梦》导读 (教学课件) -高中语文人教统编版必修下册
- 室外供热管道安装监理实施细则
- 腰背部推拿课件
- 通信管道施工质量管理流程解析
- 商场经理2025年终工作总结(二篇)
- 2023年PCB工程师年度总结及来年计划
- 绩效考核和薪酬方案通用模板
- YY/T 0590.1-2018医用电气设备数字X射线成像装置特性第1-1部分:量子探测效率的测定普通摄影用探测器
评论
0/150
提交评论