16_Python基础_Python多线程
2021/9/13 9:04:55
本文主要是介绍16_Python基础_Python多线程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Python多线程 当我们想让程序同时执行多个任务,则需要使用到多线程技术。 一、线程知识简介 进程 一个进程指的是一个正在执行的程序,每一个进程都有自己独立的一块内存空间,一组系统资源。在进程的概念中,每一个进程的内部数据和状态都是完全独立的。 在Windows操作系统中,一个进程就是一个exe或dll程序,它们相互独立,相互可以通信。 线程 在一个进程中可以包含多个线程,多线程共享一块内存空间和一组系统资源。所以,系统在各个线程之间进行切换时,开销要比进程小得多,正因如此,线程被称为轻量级的进程。 主线程 Python的程序中至少要有一个线程,这个就是主线程,程序在启动后由python解释器负责创建主线程,在程序结束后由Python解释器负责停止主线程。 在多线程中,主线程负责其它线程的启动、挂起、停止等操作。主线程外的其它线程称为子线程。 二、线程模块--threading Python官方提供的threading模块可以进行多线程的编程。 threading模块中提供了线程类Thread,还提供了相关的线程操作的函数,其中常用的函数如下 active_count() 返回当前处于活动状态的线程个数 current_thread() 返回主当前Thread对象 main_thread() 返回主线程对象。主线程是Python解释器启动的线程 三、创建子线程 要创建一个可执行的子线程,需要有两个要素 1、线程对象:线程对象是threading模块的线程类Thread和Thread子类所创建的对象 2、线程体:线程体是子线程要执行的代码,这些代码会被 封装到一个函数中。子线程在启动后会执行线程体,实现线程体主要有两种方式 自定义函数实体线程体 自定义线程类实现线程体 自定义函数实现线程体 创建线程Thread对象的构造方法如下: Thread(target=None,name=None,args=()) target参数:指向线程体函数,这个就是我们可以自定义的线程体函数 name参数:设置线程名称,如果没有指定这个参数则系统会分配一个名称 args参数:它是一个元组,为线程体函数提供的参数 # coding=utf-8 import threading import time # 定义线程体函数 def thread_body(): # 当前线程对象 t = threading.current_thread() for n in range(5): # 当前线程名 print("第{0}次执行线程【{1}】".format(n,t.name)) # 线程休眠 time.sleep(2) print('线程【{0}】执行完成!'.format(t.name)) # 创建一个线程对象t1 t1 = threading.Thread(target=thread_body) # 创建一个线程对象t2 t2 = threading.Thread(target=thread_body,name='线程t2') # 启动线程t1、t2 t1.start() t2.start() 在自定义的线程体函数中我们做了线程的休眠time.sleep(2),线程进来执行的时候会休眠两秒钟,这样创建的两个线程可以看到是交错执行的,如果我们把这个休眠除掉,则基本上会是t1执行完后再执行t2。 自定义线程类实现线程体 自定义线和类实现线程体的方式是创建一个Thread子类并重写它的run()方法,这里的run()方法就是它的线程体函数。 # coding=utf-8 import threading import time class MyThread(threading.Thread): def __init__(self,name=None): super().__init__(name=name) # 重写run方法,线程体函数 def run(self): # 当前线程对象 t = threading.current_thread() for n in range(5): # 当前线程名 print("第{0}次执行线程【{1}】".format(n,t.name)) # 线程休眠 time.sleep(2) print('线程【{0}】执行完成'.format(t.name)) # 创建线程对象t1 t1 = MyThread() # 创建线程对象t2 t2 = MyThread(name='线程t2') # 启动线程t1,t2 t1.start() t2.start() 四、线程管理 线程管理包括线程创建、线程启动、线程休眠、等待线程结束和线程停止。 等待线程结束 有时候一个线程需要等待另外一个线程执行结束后才能继续执行。 join()方法的语法如下: join(timeout=None) 参数 timeout用于设置超时时间,单位是秒。如果没有设置timeout,则可以一直等待,直到结束。 线程停止 在线程体结束时,线程就停止了,在某些较为复杂的业务场景中,会在线程体中执行一个"死循环"。线程体是否继续执行"死循环"是通过判断停止变量实现的,当”死循环“结束则线程体结束,那么线程也就结束了。 在一般情况下,死循环会执行线程任务,然后休眠,再执行,再休眠,直到结束循环 图片下载(子线程循环进行,至到控制线程输入exit) # coding=utf-8 import threading import time import urllib.request import os # 线程停止变量 isrun = True # 工程线程体函数 def workthread_body(): while isrun: # 线程开始工作 print("工作线程执行下载……") download() # 进行下载操作 # 线程休眠 time.sleep(5) print("工作线程停止工作") # 控制线程函数体 def controlthread_body(): global isrun while isrun: # 从键盘输入停止指令 command = input("请输入停止指令:") if command == 'exit': isrun = False print('控制线程结束。') def download(): url = r'https://pic.ntimg.cn/20131008/7447430_112059179000_2.jpg' req = urllib.request.Request(url) with urllib.request.urlopen(req) as response: data = response.read() f_name = 'images/download' + str(int(time.time())) + '.jpg' with open(f_name,'wb') as f: f.write(data) print("图片下载成功") # 判断目录是否存在,不存在则创建这么一个目录 if os.path.exists("image") == False: os.mkdir("images") # 工作线程 workthread = threading.Thread(target=workthread_body) workthread.start() # 控制线程 controlthread = threading.Thread(target=controlthread_body) controlthread.start()这篇关于16_Python基础_Python多线程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-03用FastAPI掌握Python异步IO:轻松实现高并发网络请求处理
- 2025-01-02封装学习:Python面向对象编程基础教程
- 2024-12-28Python编程基础教程
- 2024-12-27Python编程入门指南
- 2024-12-27Python编程基础
- 2024-12-27Python编程基础教程
- 2024-12-27Python编程基础指南
- 2024-12-24Python编程入门指南
- 2024-12-24Python编程基础入门
- 2024-12-24Python编程基础:变量与数据类型