python笔记47:多线程详解

liftword1个月前 (03-31)技术文章10

主要内容:

  • 小目标:掌握多线程;
  • 主要内容:线程类使用,多线程使用;

1. 线程基本概念

  • 线程概念:

线程是轻量级进程,是操作系统能够进行运算调度的最小单位;

线程依赖进程资源,是进程中的实际运作单位;

一个进程中可以包含多个线程,多线程可以实现并发;

多线程资源共享;

  • 为什么使用多线程:

线程创建,销毁占用的系统开销比进程小,效率高;

多线程可以共享进程中的全局资源,通信简单;

2. 多线程使用:

Pythoh中使用threading模块对线程进行操作;

2.1 线程相关方法:

  • 创建线程相关方法

方法说明:



2.2 一个例子:

创建线程:

import threading
import time

g_value = 0

def func(*args, **kwargs):
    #线程函数
    global g_value
    print('in func args:', args, kwargs)
    print('in func thread id:', threading.get_ident())
    time.sleep(1)
    #修改全局变量
    g_value = 1

if __name__ == '__main__':
    print('main thread id:', threading.get_ident())
    print("g_value:", g_value)
    #创建线程对象,指定线程函数, kwargs中key必须是字符串
    t1 = threading.Thread(target=func, args=("n1",), kwargs={'leve':1})
    #创建线程,并执行线程函数
    t1.start()
    #获取当前进程中活跃线程数量
    print("active thread:", threading.active_count())
    #等待线程结束
    t1.join()
    print("g_value:", g_value)

结果:子线程可以直接对全局变量修改

main thread id: 17328
g_value: 0
in func args: ('n1',) {'leve': 1}
active thread: 2
in func thread id: 9532
g_value: 1

3. 线程间通信:消息队列

主要方式:

通过变量,直接读写;通过消息队列;

消息队列:

from queue import Queue

Queue与多进程中的类似,主要方法:

方法说明:



一个例子:

import threading
from queue import Queue
#消息队列
msgq = Queue()

def recvmsg(*args, **kwargs):
    #线程函数,接受消息
    while True:
        msg = msgq.get()
        print('rev msg:', msg)
        if msg == 'q':
            break

def sendmsg():
    #发送消息
    while True:
        msg = input('enter:')
        msgq.put(msg)
        if msg == 'q':
            break

if __name__ == '__main__':
    #创建线程
    t1 = threading.Thread(target=recvmsg)
    t1.start()
    sendmsg()
    t1.join()

结果:

enter:1
rev msg: 1
enter:2
rev msg: 2
enter:3
rev msg: 3
enter:q
rev msg: q

5 多线程中同步

多线程中同步机制与多进程中类似:

from threading import Lock, RLock, Semaphore

详情与使用方式请参考:

python编程_互斥锁与信号量

6. python中多线程限制:

  • Python中多线程限制:

因为Python解释器中GIL限制,在多核CPU上,同一时刻只能运行单个线程;

所以Python中的多线程相对于C,C++,Java中的多线程是伪多线程。

  • GIL锁:

GIL锁全称:Global Interpreter Lock(全局解释器锁);

python设计之初的考虑,为了数据安全所做的决定。某个线程想要执行,必须先拿到GIL;

在一个python进程中GIL锁只有一个,获取不到GIL锁的线程不能被执行;

  • python中多线程执行过程:

Python程序被Python解释转译成字节码;

python解释器执行线程,首先获取GIL锁;

线程执行一定时间或者遇到资源等待,释放GIL锁;

python解释器去执行其他线程;

5. 并发编程总结:

并发编程实现:多进程或者多线程;

在IO阻塞情况下,使用并发模式,能够提高程序执行效率;

在需要大量计算情况下,并发模式提高效率可能并不明显;

多核CPU,需要并发进行计算,推荐使用多继承;

相关文章

Python中的多线程详解,让你的程序飞起来!

Python是一门高级编程语言,拥有简单易用、面向对象、可扩展等优点,因此被广泛应用于各种领域。但是在Python中,由于GIL(全局解释器锁)的存在,导致了多线程的效率不高。但是,对于某些IO密集型...

Python并发编程(3)——Python多线程详解介绍

左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。公众号:一点sir,关注领取python编程资料Python 的多线程入门是非常简单的,直接导入threading模块就可以开始多线程...

Python多线程编程到底怎么玩?核心技巧与注意事项全知道!

在 Python 中,多线程编程主要用于处理 I/O 密集型任务(如网络请求、文件读写、数据库操作等),但由于 全局解释器锁(GIL) 的存在,多线程对 CPU 密集型任务 的性能提升有限(此时建议使...

Python多线程

本文重点探究以下几个问题:多线程内存共享线程类获取线程结果方法:join/setDaemon对线程退出的作用线程无法利用多核,不是真正的并发多线程内存共享多个线程访问同一内存变量时,需要通过锁机制来实...

了解 Python 中的多线程和多处理

在软件开发领域,提高应用程序的效率和性能通常是通过多线程或多处理来实现的。这些技术允许程序同时执行多个任务,从而更好地利用系统资源并加快执行时间。在 Python 中,多线程和多处理都可用于不同的场景...

Python 多线程居然是——假的?

作者:李晓飞来源:Python 技术不过最近有位读者提问:Python 的多线程真是假的吗?一下子点到了 Python 长期被人们喜忧参半的特性 —— GIL 上了。到底是怎么回事呢?今天我们来聊一聊...