Lazy loaded imagePython之多线/进程
IT|2024-1-20|Last edited: 2025-10-8
type
status
date
slug
summary
tags
category
icon
password

概念

进程是资源分配的最小单位,一个程序至少有一个进程。
线程是程序执行的最小单位,一个进程至少有一个线程。
进程都有自己独立的地址空间,内存,数据栈等,所以进程占用资源多。由于进程的资源独立,所以通讯不方便,只能使用进程间通讯(IPC)。
线程共享进程中的数据,他们使用相同的地址空间,使用线程创建快捷,创建开销比进程小。同一进程下的线程共享全局变量、静态变量等数据,所以线程通讯非常方便,但会存在数据同步与互斥的问题,如何处理好同步与互斥是编写多线程程序的难点。
一个进程中可以存在多个线程,在单核CPU中每个进程中同时刻只能运行一个线程,只有在多核CPU中才能存在线程并发的情况。
当线程需要运行但没有运行空间时,会对线程的优先级进行判断,高优先级先运行,低优先级进程让行。

多线程样例

 
  • 其中Thread类中的参数如下
notion image

多线程锁

简单的锁

一般io操作会使用,防止同一行读取、写入等等

信号

条件变量锁/递归锁

  • condition = threading.Condition() 定位到源码查看参数
  • release() 和 wait() 都有释放锁的作用,不同在于wait() 后,该子线程就在那里挂起等待,要继续执行,就需要接收到 notify() 或者 notifyAll() 来唤醒线程,而 release() 该线程还能继续执行。
notion image
  • 可以看到的是,如果无lock,默认给个Rlock,Rlock是一个递归锁
  • 为了支持同一个线程中多次请求同一资源,Python 提供了可重入锁(RLock)。这个RLock内部维护着一个锁(Lock)和一个计数器(counter)变量,counter 记录了acquire 的次数,从而使得资源可以被多次acquire。直到一个线程所有 acquire都被release(计数器counter变为0),其他的线程才能获得资源。
  • 定位到Rlock源码中查看
notion image

Rlock 递归锁:

Condition 条件变量:

 

未完

 
Python之Pandas库Navicat导出表结构为Excel
Loading...