python【系列教程】之并发编程

举报
小米粒-biubiubiu 发表于 2020/11/28 22:47:33 2020/11/28
【摘要】 一、线程的创建和启动 import threading # 编写一个普通的函数,作为线程执行体def action(max): for i in range(max): print(threading.current_thread().getName() + " " + str(i)) for i in range(100): print(threading.curre...

一、线程的创建和启动


  
  1. import threading
  2. # 编写一个普通的函数,作为线程执行体
  3. def action(max):
  4. for i in range(max):
  5. print(threading.current_thread().getName() + " " + str(i))
  6. for i in range(100):
  7. print(threading.current_thread().getName() + " " + str(i))
  8. if i == 20:
  9. # 创建线程1
  10. t1 = threading.Thread(target=action, args=(100,))
  11. t1.start()
  12. # 创建线程2
  13. t2 = threading.Thread(target=action, args=(100,))
  14. t2.start()
  15. print('主线程执行完成')

 


  
  1. # 继承thread类创建线程类
  2. import threading
  3. class FKThread(threading.Thread):
  4. def __init__(self):
  5. threading.Thread.__init__(self)
  6. self.i = 0
  7. # 重写run方法
  8. def run(self):
  9. while self.i < 100:
  10. print(threading.current_thread().getName() + " " + str(self.i))
  11. self.i += 1
  12. # 下面是主线程
  13. for i in range(100):
  14. print(threading.current_thread().getName() + " " + str(i))
  15. if i == 20:
  16. ft1 = FKThread()
  17. ft1.start()
  18. ft2 = FKThread()
  19. ft2.start()
  20. print('主线程执行完成')

 

二、线程的生命周期

三、控制线程


  
  1. # join线程
  2. import threading
  3. def action(max):
  4. for i in range(max):
  5. print(threading.current_thread().name + " " + str(i))
  6. threading.Thread(target=action, args=(100,), name='新线程').start()
  7. for i in range(100):
  8. if i == 20:
  9. jt = threading.Thread(target=action, args=(100,), name="被join的线程")
  10. jt.start()
  11. jt.join()
  12. print(threading.current_thread().name + " " + str(i))

  
  1. #后台守护线程
  2. import threading
  3. def action(max):
  4. for i in range(max):
  5. print(threading.current_thread().name + " " + str(i))
  6. t = threading.Thread(target=action,args=(100,),name='守护线程')
  7. #将线程设置为守护线程
  8. t.daemon = True
  9. t.start()

  
  1. #线程睡眠 sleep
  2. import time
  3. for i in range(10):
  4. print('当前时间:%s' % time.ctime())
  5. #休眠1
  6. time.sleep(1)

四、线程同步

 


  
  1. class Account:
  2. # 构造方法
  3. def __init__(self, account_no, balance):
  4. self.account_no = account_no
  5. self._balance = balance
  6. # 获取一个可重入锁
  7. self.lock = threading.RLock
  8. def getBalance(self):
  9. return self.balance
  10. def draw(self, draw_aount):
  11. # 上锁
  12. self.lock.acquire()
  13. try:
  14. if self._balance >= draw_aount:
  15. print(threading.current_thread().name + "取钱成功!吐出钞票" + str(draw_aount))
  16. time.sleep(0.001)
  17. self._balance -= draw_aount
  18. print('余额:' + str(self._balance))
  19. else:
  20. print(threading.current_thread().name + "取钱失败,余额不足!" + str(draw_aount))
  21. except Exception as e:
  22. print(e)
  23. finally:
  24. # 释放锁
  25. self.lock.release()
  26. def draw(account,draw_aount):
  27. account.draw(draw_aount)
  28. acct = Account('1234567',1000)
  29. threading.Thread(name='甲',target=draw,args=(acct,800)).start()
  30. threading.Thread(name='乙',target=draw,args=(acct,800)).start()

 

五、线程通信

 


  
  1. class Account:
  2. # 构造方法
  3. def __init__(self, account_no, balance):
  4. self.account_no = account_no
  5. self._balance = balance
  6. self.cond = threading.Condition()
  7. # 定义是否已经存钱的标识
  8. self._flag = False
  9. def getBalance(self):
  10. return self.balance
  11. def draw(self, draw_aount):
  12. # 上锁
  13. self.cond.acquire()
  14. try:
  15. # 如果flag是False,表明账户中还没有存钱,取钱方法被阻塞
  16. if not self._flag:
  17. self.cond.wait()
  18. else:
  19. print(threading.current_thread().name + "取钱:" + str(draw_aount))
  20. self._balance -= draw_aount
  21. print("账户余额为:" + str(self._balance))
  22. self._flag = False
  23. self.cond.notify_all()
  24. except Exception as e:
  25. print(e)
  26. finally:
  27. # 释放锁
  28. self.cond.release()
  29. def deposit(self, deposit_amount):
  30. self.cond.acquire()
  31. try:
  32. # 如果flag标识是True,则说明账户有钱,存钱方法被阻塞
  33. if self._flag:
  34. self.cond.wait()
  35. else:
  36. print(threading.current_thread().name + "存款" + str(deposit_amount))
  37. self._balance += deposit_amount
  38. self._flag = True
  39. self.cond.notify_all()
  40. except Exception as e:
  41. print(e)
  42. finally:
  43. self.cond.release()


  
  1. #使用queue队列控制线程通信
  2. import threading
  3. import time
  4. import queue
  5. def product(bq):
  6. str_tupln = ('python','kotlin','swift')
  7. for i in range(99999):
  8. print(threading.current_thread().name+"生产者准备生产元组元素")
  9. time.sleep(0.2)
  10. bq.put(str_tupln[i%3])
  11. print(threading.current_thread().name+"生产者生产元素完成!")
  12. def consume(bq):
  13. while True:
  14. print(threading.current_thread().name+"消费者准备消费元组元素")
  15. time.sleep(0.2)
  16. t = bq.get()
  17. print(threading.current_thread().name+"消费者消费【%s】元素完成!" % t)
  18. bq = queue.Queue(maxsize=1)
  19. #启动三个线程生产元素
  20. threading.Thread(name='1',target=product,args=(bq,)).start()
  21. threading.Thread(name='2',target=product,args=(bq,)).start()
  22. threading.Thread(name='3',target=product,args=(bq,)).start()
  23. #启动一个线程消费元素
  24. threading.Thread(name='4',target=consume,args=(bq,)).start()

 

 

 

 

六、线程池

 

 


  
  1. from concurrent.futures import ThreadPoolExecutor
  2. import threading
  3. import time
  4. def action(max):
  5. my_sum = 0
  6. for i in range(max):
  7. print(threading.current_thread().name + " " + str(i))
  8. my_sum += 1
  9. return my_sum
  10. # 创建一个包含两个线程的线程池
  11. pool = ThreadPoolExecutor(max_workers=2)
  12. f1 = pool.submit(action, 50)
  13. f2 = pool.submit(action, 50)
  14. # 判断f1代表的任务是否结束
  15. print(f1.done)
  16. time.sleep(3)
  17. # 判断f2代表的任务是否结束
  18. print(f2.done)
  19. #调用result方法会阻塞当前任务,直至当前任务完成
  20. print(f1.result(), f2.result())
  21. #关闭线程池
  22. pool.shutdown()

 

 

 

 

七、线程相关类

 

 


  
  1. #定时器
  2. from threading import Timer
  3. def hello():
  4. print("hello world")
  5. t = Timer(10.0,hello)
  6. t.start()

 


  
  1. from threading import Timer
  2. import time
  3. count = 0
  4. def print_time():
  5. print("当前时间:"+time.ctime())
  6. global t,count
  7. count+=1
  8. if count < 10:
  9. t = Timer(1,print_time)
  10. t.start()
  11. t = Timer(1,print_time)
  12. t.start()

 

 


  
  1. import sched,time
  2. import threading
  3. #定义线程调度器
  4. s = sched.scheduler()
  5. def print_time(name='default'):
  6. print('%s的时间:%s' % (name,time.ctime()))
  7. print('主线程',time.ctime())
  8. #指定10秒后执行print_time函数
  9. s.enter(10,1,print_time())
  10. s.enter(5,2,print_time,argument=('位置参数',))
  11. s.enter(5,1,print_time,kwargs={'name':'关键字参数'})
  12. s.run()
  13. print('主线程',time.ctime())

 

八、多进程

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

文章来源: blog.csdn.net,作者:血煞风雨城2018,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_31905135/article/details/101020299

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。