python高级学习笔记—— 多线程编程

本文通过一个Python多线程并发执行累加操作的例子,展示了GIL(全局解释器锁)如何限制了Python在多核CPU上的并行计算能力。尽管多线程在纯计算任务上表现不佳,但在包含IO操作如延时或网络请求时能体现其优势。print函数在循环中的使用显著增加了执行时间和CPU利用率,表明IO操作是性能瓶颈之一。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面是三个线程并发执行将一个变量累加.
运行环境:
mac 8核16G
python 3.7.7

import time
import threading

tag = 0

def task1():
    print('任务1开始')
    global tag
    for i in range(1000000):
        tag +=1
        # print(tag)
    time.sleep(1)
    print('任务1结束')

def task2():
    print('任务2开始')
    global tag
    for i in range(1000000):
        tag += 1
        # print(tag)
    time.sleep(1)
    print('任务2结束')

def task3():
    print('任务2开始')
    global tag
    for i in range(1000000):
        tag += 1
        # print(tag)
    time.sleep(1)
    print('任务2结束')

if __name__ == '__main__':
    thread1 = threading.Thread(target=task1, args='')
    thread2 = threading.Thread(target=task2, args='')
    thread3 = threading.Thread(target=task3, args='')

    # thread2.setDaemon(True)
    start = time.time()

    thread1.start()
    thread2.start()
    thread3.start()

    thread1.join()
    thread2.join()
    thread3.join()
    print('主程序结束')
    print(time.time() - start)
  1. 执行结果 :
    任务1开始
    任务2开始
    任务2开始
    任务2结束
    任务2结束
    任务1结束
    主程序结束
    1.2913100719451904
    在这里插入图片描述可以看到, 用时1秒多, CPU占用极低

  2. 打开print注释, 再次执行:

  3. 在这里插入图片描述

在这里插入图片描述用时多了很多, 而且CPU利用超过了100%, 说明print 函数在大量循环的情况下会很耗时间, 而且多个线程中的print使得python占用多核CPU , 并不只是单核运行.
去掉time.sleep(1) 又会是不同的效果.

总结:

  • GIL 使得python单核运行,几乎是一个单线程程序
  • 纯计算的程序, 多线程还不如单线程
  • 有网络请求、延时之类的代码, 多线程会体现出来优势
  • IO 才是大瓶颈, 比如频繁print也会消耗大量时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值