一、查看线程数量
threading.enumerate()#Return a list of all Thread objects currently alive
#以列表形式返回存在的线程对象
实操:
import threading
import time
def demo1():
for i in range(5):
print('demo1--%d'%i)
time.sleep(1)
def demo2():
for i in range(10):
print('demo2--%d' % i)
time.sleep(1)
def main():
t1 = threading.Thread(target=demo1,name='demo1')
t2 = threading.Thread(target=demo2,name='demo2')
t1.start()
t2.start()
while True:
print(threading.enumerate())
if len(threading.enumerate()) <= 1:
break
time.sleep(1)
if __name__ == '__main__':
main()
二、线程间的资源竞争
引入:一个线程写入,一个线程读取,没问题,如果两个线程都写入呢?
2.1线程间的通信
(多线程共享全局变量)
2.2互斥锁和死锁
2.2.1互斥锁
当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制
某个线程要更改共享数据时,先将其锁定,此时资源的状态为"锁定",其他线程不能改变,只到该线程释放资源,将资源的状态变成"非锁定",其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。
创建锁
mutex = threading.Lock()
锁定
mutex.acquire()
解锁
mutex.release()
2.2.2死锁
在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
(就好像在现实社会中,男女双方在闹别扭之后,都在等待对方先道歉。
如果双方都这样固执地等待对方先开口,弄不好,就 over 了。)
资源竞争现象:
import threading
import time
# 创建一个线程锁
lock = threading.Lock() # 不可重复的锁 只能上一次
# lock = threading.RLock()# # 可上重复的锁
num = 0
def demo1(nums):
global num
# 上锁
# lock.acquire()
lock.acquire()
for i in range(nums): # 100 0 - 99 100
num += 1
# 解锁
# lock.release()
lock.release()
print('demo1-num-%d' % num)
def demo2(nums):
global num
lock.acquire()
for i in range(nums):
num += 1
lock.release()
print('demo1-num-%d' % num)
def main():
t1 = threading.Thread(target=demo1,args=(1000000,))
t2 = threading.Thread(target=demo2,args=(1000000,))
t1.start()
# time.sleep(0.3)
# t1.join()
t2.start()
# t2.join()
time.sleep(2)
print('main-num-%d' % num)
if __name__ == '__main__':
main()
三、线程队列Queue
- 队列的特点 先进先出
empty() 判断队列是否为空
full() 判断队列是否满了
get() 从队列当中取出数据
put() 将一个数据添加到队列当中
from queue import Queue
q = Queue(3)
# print(q.empty()) # True代表是空的 False 代表队列不是空的
# print(q.full()) # False代表不是满的 True 代表队列满了
q.put(1)
q.put(2)
q.put(3)
# print('='*80)
#
# print(q.empty())
# print(q.full())
# q.put(4,timeout=2)
# q.put_nowait(4)
print(q.get())
print(q.get())
print(q.get())
# print(q.get())
本文详细讲解了如何使用Python的threading模块进行线程管理,包括查看线程数量、理解线程间的资源竞争,特别是通过互斥锁解决数据同步问题以及死锁的防范。实例演示了多线程中共享变量和使用锁的场景,以及队列Queue在并发中的应用。
6万+

被折叠的 条评论
为什么被折叠?



