python之threading

本文详细介绍了进程与线程的概念及其区别,包括地址空间、资源拥有等,并深入探讨了多线程编程技术,如线程的创建、join功能、全局解释器锁(GIL)的影响及线程锁的应用。

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

a.进程和线程

进程:就是正在运行的程序实例
线程:进程中的一个实体,被系统独立调度分配的基本单位,线程自己不拥有系统资源,但是它可以和同属一个进程的线程共享资源

进程和线程的区别:
1.地址空间:进程内的一个执行单元,进程至少有一个线程,他们共享进程的地址空间,进程拥有自己独立的空间
2.资源拥有:进程的资源分配和拥有的单位,同一个进程内线程共享进程资源
3.线程是处理器调度的基本单位,进程不是
4.二者均可以并发执行b.多线程(threading)
加速程序及计算的有效方式
b1.添加线程

#coding=utf-8
import threading
print(threading.active_count()) #获取当前线程数量
print(threading.current_thread())#查看当前运行的线程
#添加线程
def thread_job():
        print('当前线程是%s'%threading.current_thread())

def thread_job2():
        print('当前线程是%s'%threading.current_thread())

thread=threading.Thread(target=thread_job)
thread1=threading.Thread(target=thread_job2)
thread.start()
thread1.start()


b2.join功能
#如果不加join,程序输出混乱,执行完全取决于两个线程的执行速度,完全有可能t2结束后出现在finish之前,通过join进行控制

#coding=utf-8
import threading

import time
def t1():
        print('t1开始了')
        for i in range(10):
                time.sleep(0.1)
        print('t1结束')

def t2():
        print('t2开始')
        print('t2结束')

th1=threading.Thread(target=t1)
th2=threading.Thread(target=t2)
th1.start()
th2.start()
th2.join()
th1.join()
print('finished')

~          

         
b3.gil(global interprter lock)
python完全支持多线程编程,但是,代码实现时候完全并行是不安全的,通过会有一个全局解释器锁(GIL)进行保护,确保任何时候只有一个线程在执行,即,使用多线程包时,代码运行速度非常快,看起来是多线程运行,其实是一个个线程轮流执行的,而且会占用较多的系统资源,增加执行开销,而且gil锁最大问题就是python多线程程序不能利用多核cpu优势

b4.线程锁
lock在不同线程中通向同一内存时候,能够确保互相之间不影响,使用lock方法实在每个线程执行运行修改内存之前,执行lock.aquire()将内存上锁,却白当前线程执行时候,内存不会被其他线程访问,执行运算完毕后,使用lock.release()打开锁,保证其他线程可以使用该内存

#coding=utf-8
import threading
def job1():
        global A,lock
        lock.acquire()
        for i in range(10):
                A+=1
                print('job',A)
        lock.release()

def job2():
        global A,lock
        lock.acquire()
        for i in range(10):
                A+=10
                print('job2',A)
        lock.release()

lock=threading.Lock()
A=0
t1=threading.Thread(target=job1)
t2=threading.Thread(target=job2)
t1.start()
t2.start()
t2.join()
t1.join()

 

 

### 使用 Python 的 `threading` 模块进行多线程编程 Python 的 `threading` 模块是标准库中用于实现多线程编程的重要模块。它允许程序同时执行多个线程,从而提高程序的并发性能,尤其适用于 I/O 密集型任务,例如网络请求、文件读写等[^3]。 #### 1. 创建线程的两种方式 `threading` 模块提供了两种主要的方式来创建线程: ##### 1.1 继承 `Thread` 类 通过继承 `threading.Thread` 类并重写 `run()` 方法,可以自定义线程的行为。 ```python import threading import time class MyThread(threading.Thread): def run(self): print('start working') time.sleep(1) print('end work') my_thread = MyThread() my_thread.start() my_thread.join() ``` ##### 1.2 使用 `target` 参数指定函数 另一种更简单的方式是直接通过 `target` 参数指定要在线程中执行的函数。 ```python import threading import time def run(): print('start working') time.sleep(1) print('end work') my_thread = threading.Thread(target=run) my_thread.start() my_thread.join() ``` #### 2. 线程同步与锁机制 在多线程环境中,多个线程可能会同时访问共享资源,从而导致数据竞争或不一致的问题。`threading` 提供了 `Lock` 类来实现线程同步。 ```python import threading lock = threading.Lock() def safe_function(): with lock: print("线程持有锁,执行操作") threads = [threading.Thread(target=safe_function) for _ in range(5)] for t in threads: t.start() for t in threads: t.join() ``` #### 3. 线程管理 - **启动线程**:调用 `start()` 方法启动线程。 - **等待线程结束**:使用 `join()` 方法阻塞主线程,直到该线程执行完毕。 - **线程名称**:可以通过 `name` 参数为线程命名,便于调试。 - **守护线程**:通过 `setDaemon(True)` 设置线程为守护线程,主线程结束时该线程会自动退出。 ```python import threading def my_function(): print("线程执行") thread = threading.Thread(target=my_function, name="WorkerThread") thread.setDaemon(True) thread.start() thread.join() ``` #### 4. 注意事项 - **GIL(全局解释器锁)**:Python 中存在 GIL,它限制了同一时刻只有一个线程执行 Python 字节码。因此,在 CPU 密集型任务中,多线程并不能显著提升性能。此时可以考虑使用 `multiprocessing` 模块。 - **线程安全**:确保多个线程访问共享资源时使用锁机制,避免数据竞争问题。 #### 5. 线程池 虽然 `threading` 模块本身没有直接提供线程池,但可以结合 `concurrent.futures` 模块使用 `ThreadPoolExecutor` 来简化线程池的管理。 ```python from concurrent.futures import ThreadPoolExecutor def task(n): print(f"任务 {n} 正在执行") with ThreadPoolExecutor(max_workers=3) as executor: for i in range(5): executor.submit(task, i) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值