网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月20日漏签0天
开课吧python吧 关注:364贴子:4,064
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 下一页 尾页
  • 20回复贴,共2页
  • ,跳到 页  
<<返回开课吧python吧
>0< 加载中...

【开课吧python】python究竟要不要使用多线程

  • 只看楼主
  • 收藏

  • 回复
  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在总结concurrent.futures库之前先来弄明白三个问题:
(1)python多线程究竟有没有用?
(2)python虚拟机机制如何控制代码的执行?
(3)python中多进程处理原理是怎么样的?


  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
1. 先来看两个例子
(1)例1
分别用单线程、使用多线程、使用多进程三种方法对最大公约数进行计算


2025-08-20 09:09:46
广告
不感兴趣
开通SVIP免广告
  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
输出:


  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
之前线程数和进程说都为3,现在修改为4再测试


  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
为了更能说明问题,将线程数和进程说继续增加为5

至于区别,大家自己感受,测试的条件(计算过于简单)、测试的环境都会影响测试结果


  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
(2)例2
同样分别用单线程、使用多线程、使用多进程三种方法对网页进行爬虫,只是简单的返回status_code


  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
输出:

一下就看出了区别


  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2. python虚拟机机制如何控制代码执行?
对于python来说,作为解释型语言,Python的解释器必须做到既安全又高效。我们都知道多线程编程会遇到的问题,解释器要留意的是避免在不同的线程操作内部共享的数据,同时它还要保证在管理用户线程时保证总是有最大化的计算资源。python是通过使用全局解释器锁来保护数据的安全性。


2025-08-20 09:03:46
广告
不感兴趣
开通SVIP免广告
  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
python 代码的执行由python虚拟机来控制,即Python先把代码(.py文件)编译成字节码(字节码在Python虚拟机程序里对应的是 PyCodeObject对象,.pyc文件是字节码在磁盘上的表现形式),交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行。 python在设计的时候在虚拟机中,同时只能有一个线程执行。同样地,虽然python解释器中可以运行多个线程,但在任意时刻,只有一个线程在解释器 中运行。而对python虚拟机的访问由全局解释器锁来控制,正是这个锁能保证同一时刻只有一个线程在运行。


  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在多线程的环境中,python虚拟机按一下 方式执行:
(1)设置GIL(global interpreter lock)
(2)切换到一个线程执行
(3)运行:指定数量的字节码指令、线程主动让出控制(可以调用time.sleep(0))


  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
(4)把线程设置为睡眠状态
(5)解锁GIL
(6)再次重复以上步骤。


  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
GIL的特性,也就导致了python不能充分利用多核cpu。而 对面向I/O的(会调用内建操作系统C代码的)程序来说,GIL会在这个I/O调用之前被释放,以允许其他线程在这个线程等待I/O的时候运行。如果线程 并未使用很多I/O操作,它会在自己的时间片一直占用处理器和GIL。


  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
3. python多线程究竟有没有用?
通过前面的例子和python虚拟机制的理解对多线程的使用应该很清楚了,I/O密集型python程序比计算密集型的程序更能充分利用多线 程的好处。 总之,在计算密集型的程序中不要python多线程,使用python多进程进行并发编程,就不会有GIL这种问题存在,并且也能充分利用多核cpu。


  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
(1)GIL不是bug,Guido也不是水平有限才留下这么个东西。龟叔曾经说过,尝试不用GIL而用其他的方式来做线程安全,结果python语言整体效率又下降了一倍,权衡利弊,GIL是最好的选择——不是去不掉,而是故意留着的


2025-08-20 08:57:46
广告
不感兴趣
开通SVIP免广告
  • 语子易
  • 知名人士
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
(2)想让python计算速度快起来,又不想写C,用pypy吧,这才是真正的大杀器
(3)可以使用协程来提高cpu的利用率,使用multiprocessing和gevent


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 20回复贴,共2页
  • ,跳到 页  
<<返回开课吧python吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示