Python多线程1,threading.thread创建多线程&全局变量解锁和锁定,1threadingThread,加锁

本文探讨了如何使用Python threading模块创建多线程,包括独立线程的启动与同步,以及在共享全局变量时如何通过互斥锁实现正确加锁和解锁,避免资源竞争和死锁问题。

Python多线程1,threading.thread创建多线程&全局变量解锁和锁定,1threadingThread,加锁

1、开启两个线程分别执行函数
在这里插入图片描述

import time
import threading


def sing():
    for i in range(5): #  子线程
        print("----正在唱------")
        time.sleep(1)



def dance():
    for i in range(5): #  子线程
        print("----正在跳------")
        time.sleep(1)

# main函数里是主线程,各个函数执行子线程,子线程执行,主线程等待
def main():
    t1 = threading.Thread(target = sing)
    t2 = threading.Thread(target = dance)
    t1.start()
    t2.start()
    #主线程进行等待



if __name__ == "__main__":
    main()

2、开启多个线程共享同一个变量并且进行开锁和解锁

# 两个线程同时操作全局变量的问题--资源竞争
# 同步:互斥锁,避免死锁:添加超过时间
import time
import threading

""" 
lock()创建没上锁的互斥锁
acquire()上锁
release()解锁
 """


g_num = 0
def test1(num):
    global g_num
    
    for i in range(num):

        mutex.acquire()
        g_num += 1
        mutex.release()
    
    print("--------in test1 g_num=%d-------" % g_num)


def test2(num):
    global g_num
    for i in range(num):
        mutex.acquire()
        g_num += 1
        mutex.release() 
    print("--------in test2 g_num=%d-------" % g_num)


mutex = threading.Lock()

def main():

 

      #target指定将来 这个线程去哪个函数执行代码
      #args指定将来调用函数时 传递什么参数进去
      #arg关键字可以向函数里传入参数(元组)
      #下面两个分别循环4和1000000次 


    t1 = threading.Thread(target = test1, args=(4,))
    t2 = threading.Thread(target = test2, args=(1000000,))

    t1.start()
    t2.start()

    time.sleep(4)
    print("--------in main Thread g_num=%d-------" % g_num)


if __name__ == "__main__":
    main()
<think>根据用户要求,需要回答Python threading.Thread的使用方法示例。用户提供了个引用,我将从中提取关键信息并组织回答。 关键点: 1. threading.Thread类用于创建管理线程 2. 线程的启动:使用start()方法 3. 线程的同步:使用join()方法,使调用线程等待直到该线程结束 4. 线程的run()方法:定义线程执行的功能,通常通过target参数指定 5. 线程同步threading.Lock用于保护共享资源 6. 线程停止:Python没有直接提供stop方法,需要自己设计 回答结构: 1. 引入threading模块,创建Thread对象 2. 线程启动与运行 3. 线程同步(join) 4. 共享资源保护(Lock) 5. 线程停止的注意事项 示例将包括: 1. 基本线程创建启动 2. 使用join等待线程结束 3. 使用Lock保护共享变量 4. 关于线程停止的说明 注意:按照系统指令,数学公式使用$...$,但本问题不涉及数学公式,所以主要关注代码文字描述。 同时,回答末尾需要生成相关问题。 </think> ### Python threading.Thread 使用方法与示例 `threading.Thread` 是 Python 标准库中实现多线程编程的核心类,用于创建管理线程。以下是详细使用方法代码示例: #### 1. **基本使用** ```python import threading import time def task(): print(f"线程 {threading.current_thread().name} 启动") time.sleep(1) print(f"线程 {threading.current_thread().name} 结束") # 创建线程对象 thread = threading.Thread(target=task, name="工作线程") # 启动线程 thread.start() # 主线程继续执行 print("主线程继续执行...") thread.join() # 等待子线程结束 print("所有线程完成") ``` - **关键参数**: - `target`:线程执行的函数 - `name`:线程名称(默认为 Thread-N) - `args/kwargs`:传递给函数的参数 #### 2. **线程同步 (join())** `join()` 会阻塞当前线程直到目标线程结束: ```python def counter(): for i in range(3): print(f"{threading.current_thread().name}: {i}") time.sleep(0.5) t1 = threading.Thread(target=counter, name="线程A") t2 = threading.Thread(target=counter, name="线程B") t1.start() t1.join() # 主线程在此等待t1完成 t2.start() # t2在t1结束后启动 t2.join() ``` **输出**: ``` 线程A: 0 线程A: 1 线程A: 2 线程B: 0 线程B: 1 线程B: 2 ``` #### 3. **共享资源保护 (Lock)** 使用防止数据竞争: ```python shared_value = 0 lock = threading.Lock() def increment(): global shared_value for _ in range(100000): with lock: # 使用上下文管理器自动加锁/解锁 shared_value += 1 threads = [] for i in range(5): t = threading.Thread(target=increment) threads.append(t) t.start() for t in threads: t.join() print(f"最终值: {shared_value}") # 正确输出 500000 ``` 无时结果会小于 500000,因存在数据竞争[^4]。 #### 4. **线程停止注意事项** Python 没有直接停止线程的方法,需通过标志位控制: ```python class StoppableThread(threading.Thread): def __init__(self): super().__init__() self._stop_flag = False def run(self): while not self._stop_flag: print("线程运行中...") time.sleep(0.5) def stop(self): self._stop_flag = True t = StoppableThread() t.start() time.sleep(2) t.stop() # 安全停止线程 t.join() ``` #### 5. **线程生命周期** | 方法 | 说明 | |-------------|-----------------------------| | `start()` | 启动线程,自动调用 `run()` | | `run()` | 线程实际执行的任务[^1] | | `join()` | 阻塞调用线程直到本线程结束[^2][^3] | | `is_alive()`| 检查线程是否在运行 | > ⚠️ **注意事项**: > 1. Python 存在 GIL(全局解释器),多线程适合 I/O 密集型任务 > 2. 避免直接终止线程,可能引发资源未释放问题[^5] > 3. 复杂场景建议使用 `threading.Event` 或队列 (`queue.Queue`) 通信
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值