Python threading模块使用详解:线程创建、参数传递与资源竞争

今天早睡
今天早睡
发布时间:2026-10-14 | 3人浏览过
原创

本文详细介绍Python中threading模块的核心用法。涵盖如何创建单线程与多线程对象,解析主线程与子线程的执行关系及守护线程设置。通过代码示例演示args和kwargs参数传递方式,并分析多线程环境下的资源竞争问题及解决方案,帮助开发者掌握Python并发编程基础。

1. 使用threading模块创建线程对象

承接前文案例,我们可以利用程序阻塞的时间段来执行后续任务,这可以通过多线程机制来实现。具体实现需要借助Python内置的threading模块: 代码如下


import time
import threading
def work():
"""只有函数对象才能佈田名线积"""
print('5.洗茶杯: 1min ' )
time.sleep(1)
print('6.放茶叶: 1min ' )
time.sleep(1)

start_time = time .time()
print( '1.洗壶: 1min ' )
time.s1eep(1)
print( '2.灌凉水:1min ' )
time.sleep(1)
print( '3.烧水: 1min ' )
time.sleep(1)
print( '4.等水烧开:3min ' )
work_thread = threading.Thread(target=work)

# 启动线程对象
work_thread.start()
time.sleep(1) # 5.洗茶杯: 1min
time.sleep(1) # 6.放茶叶: 1min
time.sleep(1)
print( '7.泡茶:1min ' )
time.sleep(1)
print('总共花了: ',time.time() - start_time)

上述案例展示的是单线程执行流程。需要特别注意,threading模块所操作的主体必须是函数对象。通过threading模块,可以将一个普通的函数转换为线程对象。

2. 使用threading模块创建多线程

当一个进程启动时,默认会生成一个主线程。由于线程是程序执行流的最小单元,在设置多线程时,主线程会创建多个子线程。在Python中,默认情况下,当主线程执行完自身任务后便会退出,此时子线程会继续执行自己的任务,直到任务结束。


import time
import threading

def upload():
print("开始上传文件...")
time.sleep(2)
print("完成上传文件...")

def down1oad():
print("开始下载文件...")
time.s1eep(2)
print("完成下载文件...")

if __name__ == '__main__':
upload_thread = threading.Thread(target=up1oad)
up1oad_thread .start()
up1oad_thread.join()
down1oad_thread = threading.Thread(target=down1oad,daemon=True)
down1oad_thread.start()
print('主线程结束')

这意味着主线程在分配任务时会创建多个子线程,子线程的执行进度不会阻碍主线程的运行。但是,主线程会等待所有子线程执行完毕后才正式结束。也就是说,实际上主线程的任务是先完成的。如果希望主线程执行完毕后立即结束整个进程,可以设置守护线程(daemon thread)。

3. 多线程的参数传递

在多线程中进行参数传递时,使用args接收位置参数,使用kwargs接收关键字参数。示例如下:


import threading

def get(ur1,header=None):
    print(ur1)
    print(header)

for url in [ 'https : / /www.baidu.com', 'https:/ /www. soso.com ' ,' https: / /www . 360. com']:
    # threading.Thread
get_thread = threading. Thread(target=get,args=(ur1, ), kwargs={ ' header ':{ 'user-agent ' : ' pythonrequests'}})
    get_thread.start

4. 线程产生的资源竞争

首先通过一个案例来观察这一现象:


import threading
import time
import random

def add1(n):
    for i in range(100) :
        time.sleep(random.randint(1,3))
        with open( 'he7lo.txt', mode='a', encoding='utf-8 ' ) as f:
            f.write(f'in} he1lo wor1d !'+ 'he7lo wor1d !'*1024)
            f.write(' \n ')

if __name__ == '___main__' :
    for n in range(10) :
        t1 = threading. Thread(target=add1,args=(n,))
        t1.start()

以上即为Python threading模块使用指南的详细内容,更多关于Python threading模块的使用资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表