当前位置:   article > 正文

Python3多线程学习_python3 多线程

python3 多线程

一、简单实现多线程的方法

使用继承的方式实现多线程

  1. import threading
  2. class myTread(threading.Thread):
  3. def __init__(self):
  4. threading.Thread.__init__(self)
  5. def run(self):
  6. pass
  7. if __name__ == '__main__':
  8. mythread = myTread()
  9. mythread.start()

二、配合queue多线程实现同步

实现打印10000000个数字的方式对单线程和多线程进行对比,实现代码如下

  1. import threading
  2. import queue
  3. import time
  4. class myTread(threading.Thread):
  5. def __init__(self):
  6. threading.Thread.__init__(self)
  7. def run(self):
  8. while not q.empty():
  9. print(q.get_nowait()) #从队列中取数据,并打印输出
  10. q.task_done() #判断单条get是否取完毕
  11. if __name__ == '__main__':
  12. q = queue.Queue()
  13. #先把数据放入队列中
  14. for i in range(1000000):
  15. q.put(i)
  16. #设置开始时间
  17. start_time = time.time()
  18. for i in range(7):
  19. t1 = myTread()
  20. t1.start()
  21. q.join() #判断队列是否已经取完,没取完之前就会就行线程堵塞
  22. end_time = time.time()
  23. # print('时间:{}'.format((end_time - start_time))) #计算程序运行时间
  24. print(f'时间:{end_time - start_time}')

单线程运行时间:

多线程运行时间,这个我开7个线程:

发现反而是单线程的执行效率比多线程的快好多。

Python中对GIL的理解:

Python是解释型语言,那么它在运行的时候就需要解释器了,简单描述下GIL,即global interpreter lock,全局解释器锁,就是python在运行的时候会锁定解释器,就是说在运行的时候只能是一个线程,锁死了,切换不了;每个线程在运行之前都要申请GIL,那么就必须要等上一个线程释放这把锁你才可以申请到,然后执行代码,执行完后,你再交给下一个线程,让它去执行代码,所以多线程会频繁的竞争得到GIL,固然要比单线程的时间多,过程如下:

  设置GIL -> 切换到一个线程去执行 -> 运行 -> 把线程设置为睡眠状态 -> 解锁GIL

总结

Python的多线可以大幅提高代码的效力,但是对于人工智能来说就不太适合了,所以数据领域没有多线程提高效率之说,只有将CPU提升到GPU,TPU来提升计算能力。

Python多现实适合于IO密集型任务:

比如爬虫,当向服务器发送请求的时候,要等服务器响应返回数据,程序才会释放GIL锁,进程才会往下执行,如果是单线程的话,每一次请求都要等待前面的进程访问时间,每次请求服务器返回的数据时间都不一样,如果每次请求都要排队等待的话,反而时间会更长,那么单线程显而易见反而效力底下,如果多线程的话就是实现并发请求,反而效力更高

参考博客:

Python3 多线程为啥比单线程优秀_奋力的小白的博客-CSDN博客

python多线程比单线程效率低_多线程比单线程快,是真的吗?_weixin_39800971的博客-CSDN博客

三、Python实现线程池

Python简单实现线程池代码如下所示

  1. import queue
  2. from concurrent.futures import ThreadPoolExecutor, as_completed
  3. q = queue.Queue()
  4. data_list = [1,2,3,4,5,6,7,8,9,10]
  5. for i in data_list:
  6. q.put(i)
  7. # 开启线程池 max_workers表示支持的最大线程数
  8. with ThreadPoolExecutor(max_workers=17) as t:
  9. relt_list = []
  10. while not q.empty():
  11. agrs = q.get()
  12. rest = t.submit(g_t_main, agrs)
  13. q.task_done()
  14. relt_list.append(rest)
  15. # 判断单个线程是否执行完毕
  16. for future in as_completed(relt_list):
  17. data = future.result()
  18. print(f"main: {data}")

线程池可以有效的防住线程堵塞和资源竞争问题,优化线程池使用代码如下所示

  1. import concurrent.futures
  2. import queue
  3. from concurrent.futures import ThreadPoolExecutor, as_completed
  4. q = queue.Queue()
  5. data_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  6. for i in data_list:
  7. q.put(i)
  8. def g_t_main(s):
  9. return s
  10. # 开启线程池 max_workers表示支持的最大线程数
  11. with ThreadPoolExecutor(max_workers=3) as t:
  12. all_task = []
  13. while not q.empty():
  14. all_task.append(t.submit(g_t_main, q.get()))
  15. concurrent.futures.wait(all_task)
  16. # 判断整个线程是否执行完毕
  17. for future in as_completed(all_task):
  18. data = future.result()
  19. print(f"main: {data}")

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

闽ICP备14008679号