python 多线程

本文介绍了Python中的全局解释器锁(GIL)及其对多线程执行的影响,展示了如何使用`threading`模块进行多线程编程,并通过示例解释了线程的创建、设置守护线程、线程同步以及线程类的自定义。同时,文中通过实例演示了多线程执行的并发情况,强调了GIL限制了Python在多核CPU上的并行执行能力。

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

1)python中的GIL:

GIL: global interpreter lock (全局解释器锁)

cpython中一个线程对应c语言中的一个线程,GIL使得同一时刻只有一个线程在一个cpu上执行字节码,无法映射多个线程到多个cpu上,不能发挥多核优势。
GIL会根据执行的字节码行数以及时间片段释放GIL,GIL遇到io操作的时候会主动释放。


2)多线程编程 threading
线程是操作系统调度的最小单元
import time
import threading


def get_html_detail(url):
    print('开始获取html界面')
    time.sleep(3)
    print('获取html界面元素成功')

def get_url(url):
    print('获取界面元素url开始')
    time.sleep(3)
    print('获取界面元素url结束')


thread1 = threading.Thread(target=get_html_detail,args=('url',))
thread2 = threading.Thread(target=get_url,args=('url',))
start_time = time.time()
#设置线程为守护线程,主线程结束时推出
#thread1.setDaemon(True)
#thread2.setDaemon(True)
thread1.start()
thread2.start()

#将两个线程加入主线程
thread1.join()
thread2.join()

#主线程退出,子线程自动kill
print('持续时间 {}'.format(time.time() - start_time))
------------------------------------------------

debug下可以看到有三个线程存在:MainThread thread-6 thread-7

线程是并行的thread-1 thread-2 开始后不会影响到MainThread的运行所以“print(‘持续时间 {}’.format(time.time() - start_time))”这个代码也会运行。

setDaemon将线程设置为守护线程,主线程退出时自动退出
join将子线程加入主线程,当子线程结束后才运行主线程代码。

通过继承thread实现多线程

import time
import threading
class GETHTML(threading.Thread):
    def __init__(self,name):
        super().__init__(name=name)

    def run(self):
        print('开始获取html界面')
        time.sleep(3)
        print('获取html界面元素成功')


class GETURL(threading.Thread):
    def __init__(self,name):
        super().__init__(name=name)

    def run(self):
        print('获取界面元素url开始')
        time.sleep(4)
        print('获取界面元素url结束')

if __name__ == '__main__':
    thread1 = GETHTML('get_html')
    thread2 = GETHTML('get_url')
    start_time = time.time()

    print('主线程开始')
    thread1.start()
    thread2.start()

    thread1.join()
    thread2.join()

    print('主线程用时{}'.format(time.time() - start_time))
----------------------------------------
主线程开始
开始获取html界面
开始获取html界面
获取html界面元素成功
获取html界面元素成功
主线程用时3.017345666885376
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值