加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

一篇文章读懂 Python 多线程

发布时间:2019-09-25 01:31:04 所属栏目:建站 来源:编程派
导读:Threading模块从 Python 1.5.2 版开始呈现,用于加强底层的多线程模块thread。Threading 模块让操纵多线程变得更简朴,而且支持措施同时运行多个操纵。 留意,Python 中的多线程最好用于处理赏罚有关 I/O 的操纵,如从网上下载资源可能从当地读取文件可能目次

假如往以上代码添加 time.sleep函数并给出差异长度的时刻,也许会让这个例子更故意思。无论怎样,这里的题目是,一个线程也许已经挪用update_total函数而且还没有更新完成,此时另一个线程也有也许挪用它而且实行更新内容。按照操纵执行次序的差异,该值也许只被增进一次。

让我们给这个函数添加锁。有两种要领可以实现。第一种方法是行使 try/finally,从而确保锁必定会被开释。下面是示例:

  1. import threading 
  2.  
  3. total = 0 
  4.  
  5. lock = threading.Lock 
  6. def update_total(amount): 
  7. """ 
  8. Updates the total by the given amount 
  9. """ 
  10. global total 
  11. lock.acquire 
  12. try: 
  13. total += amount 
  14. finally: 
  15. lock.release 
  16. print (total) 
  17.  
  18. if __name__ == '__main__': 
  19. for i in range(10): 
  20. my_thread = threading.Thread( 
  21. target=update_total, args=(5,)) 
  22. my_thread.start 

如上,在我们做任那里理赏罚之前就获取锁。然后实行更新 total 的值,最后开释锁并打印出 total 的当前值。究竟上,我们可以行使 Python 的 with语句停止行使 try/finally 这种较为繁琐的语句:

  1. import threading 
  2.  
  3. total = 0 
  4.  
  5. lock = threading.Lock 
  6.  
  7. def update_total(amount): 
  8. """ 
  9. Updates the total by the given amount 
  10. """ 
  11. global total 
  12. with lock: 
  13. total += amount 
  14. print (total) 
  15.  
  16. if __name__ == '__main__': 
  17. for i in range(10): 
  18. my_thread = threading.Thread( 
  19. target=update_total, args=(5,)) 
  20. my_thread.start 

正如你看到的那样,我们不再必要 try/finally作为上下文打点器,而是由with语句作为更换。

虽然你也会碰着要在代码中通过多个线程会见多个函数的环境。当你第一次编写并发代码时,代码也许是这样的:

  1. import threading 
  2.  
  3. total = 0 
  4.  
  5. lock = threading.Lock 
  6. def do_something: 
  7. lock.acquire 
  8. try: 
  9. print('Lock acquired in the do_something function') 
  10. finally: 
  11. lock.release 
  12. print('Lock released in the do_something function') 
  13. return "Done doing something" 
  14.  
  15. def do_something_else: 
  16. lock.acquire 
  17. try: 
  18. print('Lock acquired in the do_something_else function') 
  19. finally: 
  20. lock.release 
  21. print('Lock released in the do_something_else function') 
  22. return "Finished something else" 
  23.  
  24. if __name__ == '__main__': 
  25. result_one = do_something 
  26. result_two = do_something_else 

这样的代码在上面的环境下可以或许正常事变,但假设你有多个线程都挪用这两个函数呢。当一个线程正在运行这两个函数,然后其它一个线程也也许会修改这些数据,最后获得的就是不正确的功效。题目是,你乃至也许没有顿时意识到功效错了。有什么办理步伐呢?让我们试着找出谜底。

凡是起首想到的就是在挪用这两个函数的处所上锁。让我们试着修改上面的例子,修改成如下所示:

  1. import threading 
  2.  
  3. total = 0 
  4.  
  5. lock = threading.RLock 
  6. def do_something: 
  7.  
  8. with lock: 
  9. print('Lock acquired in the do_something function') 
  10. print('Lock released in the do_something function') 
  11. return "Done doing something" 
  12.  
  13.  
  14. def do_something_else: 
  15. with lock: 
  16. print('Lock acquired in the do_something_else function') 
  17. print('Lock released in the do_something_else function') 
  18. return "Finished something else" 
  19.  
  20. def main: 
  21. with lock: 
  22. result_one = do_something 
  23. result_two = do_something_else 
  24. print (result_one) 
  25. print (result_two) 
  26.  
  27. if __name__ == '__main__': 
  28. main 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读