当前位置:   article > 正文

python培训第三课(多线程)_th=threading.thread(target=os_systemd,kwargs={"mac

th=threading.thread(target=os_systemd,kwargs={"mac_str":self.mac_addr})th.st

多线程

python程序中实现多任务的一种方式。线程是程序执行的最小单位。同属一个进程的多个线程共享进程所拥有的的全部资源。

步骤:

a 导入线程模块 import threading

b 创建子线程并指定执行的任务

sing_thread=threading.Thread(target=sing)

c启动线程执行任务

sing_thread.start()

线程执行带有参数的任务时,可用args(以元组方式传参)或 kwargs(以字典方式传参)

  1. import threading # 导入线程模块
  2. import time # 导入时间模块
  3. def sing(x): # 构造函数
  4. for i in range(x):
  5. print("唱歌")
  6. time.sleep(2) # 休眠2秒
  7. def dance(y): # 构造函数
  8. for i in range(y):
  9. print("跳舞")
  10. time.sleep(2) # 休眠2秒
  11. t1=threading.Thread(target=sing, args=(1,)) # 创建子进程t1并指定执行的任务sing,使用args传参
  12. t2 = threading.Thread(target=dance, kwargs={"y": 2}) # 创建子进程t2并指定执行的任务dance,使用kwargs传参
  13. # 启动线程执行任务
  14. t1.start()
  15. t2.start()

使用类来创建多线程

  1. import threading # 导入线程模块
  2. import time # 导入时间模块
  3. class MyThread(threading.Thread): # 定义类,继承自threading.Thread这个基类
  4. def __init__(self, n): # 初始化 ,并传递参数n
  5. super(MyThread, self).__init__()
  6. self.n = n
  7. def run(self): # 启动线程的函数,此种方式创建多线程,函数名只能为run,不能自定义
  8. print('以类的方式创建多线程', self.n)
  9. time.sleep(3)
  10. r1 = MyThread(11) # 实例化对象
  11. r2 = MyThread(22)
  12. r1.start() # 启动线程
  13. r2.start()

多线程的特性 : 主线程会等待所有子线程结束之后才会结束程序 

线程锁

为什么需要线程锁?
多个线程对同一个数据进行修改时, 可能会出现不可预料的情况.
例如实现银行转账功能,money += 1 这句其实有三个步骤 money; money+1; money=money+1;假如这三步骤还没完成money-=1的线程就开始执行了,后果可想而知,money的值肯定时乱的
如何实现线程锁?
1. 实例化一个锁对象;
lock = threading.Lock()
2. 操作变量之前进行加锁
lock.acquire()
3. 操作变量之后进行解锁
lock.release()

B站线程锁例子:

  1. import threading # 导入线程模块
  2. def test(): # 构造函数
  3. global x # 全局变量x
  4. lock.acquire() # 申请一把线程锁
  5. x += 1
  6. lock.release() # 操作x之后将线程锁释放
  7. if __name__ == '__main__':
  8. x = 0
  9. res = [] # 定义一个空列表
  10. lock = threading.Lock() # 对线程里面的锁进行实例化
  11. for i in range(100): # 起100个多线程
  12. t = threading.Thread(target=test)
  13. t.start()
  14. res.append(t) # 将线程加入列表
  15. for t in res: # 遍历列表
  16. t.join()
  17. print(x) # 输出线程个数 100

例子2:银行存钱和取钱

  1. import threading
  2. # 银行存钱和取钱
  3. def add(lock):
  4. global money # 生命money为全局变量
  5. for i in range(1000000):
  6. # 2. 操作变量之前进行加锁
  7. lock.acquire()
  8. money += 1 # money; money+1; money=money+1;
  9. # 3. 操作变量之后进行解锁
  10. lock.release()
  11. def reduce(lock):
  12. global money
  13. for i in range(1000000):
  14. # 2. 操作变量之前进行加锁
  15. lock.acquire()
  16. money -= 1
  17. # 3. 操作变量之后进行解锁
  18. lock.release()
  19. if __name__ == '__main__':
  20. money = 0
  21. # 1. 实例化一个锁对象;
  22. lock = threading.Lock()
  23. t1 = threading.Thread(target=add, args=(lock,))
  24. t2 = threading.Thread(target=reduce, args=(lock,))
  25. t1.start()
  26. t2.start()
  27. t1.join()
  28. t2.join()
  29. print("当前金额:", money)

递归锁:锁嵌套时,注意要用 lock= threading.Rlock()

视频网址 69-Python多线程-递归锁_哔哩哔哩_bilibili

  1. import threading
  2. def run1():
  3. global x
  4. lock.acquire()
  5. x += 1
  6. lock.release()
  7. return x
  8. def run2():
  9. global y
  10. lock.acquire()
  11. y += 1
  12. lock.release()
  13. return y
  14. def run3():
  15. lock.acquire()
  16. res1 = run1()
  17. res2 = run2()
  18. print(res1, res2)
  19. lock.release()
  20. if __name__ == '__main__':
  21. x = 0
  22. y = 0
  23. lock = threading.RLock()
  24. for i in range(50):
  25. s = threading.Thread(target=run3())
  26. s.start()
  27. while threading.activeCount() != 1:
  28. print(f"正在运行{threading.activeCount()}个线程")
  29. print("程序运行结束")

作业:在一个线程中,每秒循环输出当前的年月日分秒,与此同时,在另一线程中,实现张三的姓名每2秒打印输出4次结束。注意:都需要使用类和继承来实现功能
不使用类创建:

  1. import threading # 导入线程模块
  2. import time # 导入时间模块
  3. def date(): # 构造方法
  4. while True:
  5. time.sleep(1) # 休眠1秒
  6. print(time.strftime('%Y-%m-%d %X')) # 输出当前时间(年月日分秒)
  7. def run(): # 构造方法
  8. while True:
  9. time.sleep(3) # 休眠3秒
  10. print("张三")
  11. t1 = threading.Thread(target=date) # 创建子线程t1并指定执行的任务date
  12. t2 = threading.Thread(target=run) # 创建子线程t2并指定执行的任务run
  13. t1.start() # 启动线程
  14. t2.start()

使用类创建:

  1. import time # 导入线程模块
  2. import threading # 导入时间模块
  3. class First(threading.Thread): # 定义First类,继承自threading.Thread这个基类
  4. def run(self): # 构造函数
  5. while True:
  6. localtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) # 输出当前时间
  7. print(localtime)
  8. time.sleep(1) # 休眠一秒
  9. class Second(threading.Thread): # 定义second类,继承自threading.Thread这个基类
  10. def __init__(self, name): # 初始化 ,并传递参数name
  11. super(Second, self).__init__()
  12. self.name = name
  13. def run(self): # 启动线程的函数,此种方式创建多线程,函数名只能为run,不能自定义
  14. for i in range(4): # 张三姓名输出4次后结束
  15. print(self.name)
  16. time.sleep(0.5) # 每打印一次后暂停0.5秒
  17. if __name__ == '__main__':
  18. t1 = First() # 实例化对象
  19. t2 = Second("张三")
  20. t1.start() # 启动线程执行任务
  21. t2.start()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/143432
推荐阅读
相关标签
  

闽ICP备14008679号