首页 > 编程语言 >python的threading模块

python的threading模块

时间:2023-05-25 12:01:05浏览次数:45  
标签:get python content threading 线程 模块 time start

线程

线程被称为轻量级进程(Lightweight Process,LWP),是cpu调度的基本单位

组成:线程ID、当前指令指针(PC)、寄存器集合、堆栈组成

在单个程序中同时运行多个线程完成不同的工作,称为多线程。

python中提供了thread和threading模块对线程进行操作,其中thread模块是比较底层的模块,threading模块对thread做了一些包装,使用更方便。

threading模块常用方法

  • threading.active_count()                                返回当前处于active状态的Thread对象的个数
  • threading.current_thread()                             返回当前Thread对象
  • threading.get_ident()                                      返回当前线程的线程标识
  • threading.enumerate()                                    返回当前处于active状态的所有Thread对象列表
  • threading.main_thread()                                  返回主线程对象,启动python解释器的线程对象
  • threading.stack_size()                                      返回创建线程时使用的栈的大小,如果指定                                                                               size参数,则用来指定后续创建的线程使用的                                                                             栈大小,size必须是0(标识使用系统默认值)                                                                            或大于32K的正整数

threading模块提供了Thread、Lock、RLock、Condition、Event、Timer和Semaphore等类支持多线程。

###计算主线程的运行时间
import requests
import time
import functools
import threading
def runtime(func):#func要接收一个callable对象
    print("this is run time")
    @functools.wraps(func)  # 保留传递进来函数的元数据,将他的元数据赋值给inner
    def inner(*args,**kwargs):#所以把功能写在inner里就行
        start=time.time()
        result=func(*args,**kwargs)#要将原函数的返回值保存起来
        end=time.time()
        print(f"函数执行花了{end-start}s")
        return result
    return inner
def get_content(url):
    text=requests.get(url).content
    time.sleep(0.5)
    print("get content")
@runtime
def main():
    for i in range(5):
        # get_content("https://www.baidu.com")
        #创建多线程,有六个线程---一个主线程五个子线程
        #target--->指定传入的方法名字,要做什么
        #args--->指定方法需要传入的参数(元组类型)
        t=threading.Thread(target=get_content,args=("https://www.baidu.com",))
        t.start()#启动线程-->自动的执行run方法
main()

输出:
this is run time
函数执行花了0.001995086669921875s#统计的是main线程创建子线程的时间
get content
get content
get content

Thread实例方法

• t.name:获取或设置线程的名称

• t.getName()/setName(name): 获取/设置线程名。

• t.is_alive()、t.isAlive():判断线程是否为激活状态。返回线程是否在运行。正在运行指启动后、终止前。

• t.ident :获取线程的标识符。线程标识符是一个非零整数,只有在调用了start()方法之后该属性才有效,否则它只返回None

• t.run() :线程被cpu调度后自动执行线程对象的run方法

• t.start(): 线程准备就绪,等待CPU调度,start会自动调用t.run()

• t.join([timeout]): 阻塞当前上下文环境的线程,直到调用此方法的线程终止或到达指定的timeout(可选参数)。

t.setDaemon(bool): 设置是后台线程(默认前台线程(False))。(在start之前设置)

  • Python3.10中,set.Daemon(aTrue)这种写法已经弃用了,正确的写法是.daemon=True
  • 举例:
  • t=threading.Thread(target=h)
  • t.daemon=True
  • t.start()
  • 如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,主线程和后台线程均停止
  • 如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止

• t.isDaemon:判断是否为后台线程

#设置是后台线程
#t.daemon=True
import requests
import time
import functools
import threading
def runtime(func):#func要接收一个callable对象
    print("this is run time")
    @functools.wraps(func)  # 保留传递进来函数的元数据,将他的元数据赋值给inner
    def inner(*args,**kwargs):#所以把功能写在inner里就行
        start=time.time()
        result=func(*args,**kwargs)#要将原函数的返回值保存起来
        end=time.time()
        print(f"函数执行花了{end-start}s")
        return result
    return inner
def get_content(url):
    text=requests.get(url).content
    time.sleep(0.5)
    print("get content")
@runtime
def main():
    t_list=[]
    for i in range(5):
        # get_content("https://www.baidu.com")
        #创建多线程
        #target--->指定传入的方法名字,要做什么
        #args--->指定方法需要传入的参数(元组类型)
        t=threading.Thread(target=get_content,args=("https://www.baidu.com",))
        t_list.append(t)
        #默认为前台线程,主线程执行完了,等子线程执行完再退出
        #t.setDaemon=True#设置后台线程,主线程退出子线程就立马退出
        t.daemon=True
        t.start()#启动线程-->自动的执行run方法
        # t.join()#若是join放在此处多线程将没有意义
    # for t in t_list:
    #     #阻塞当前环境(谁执行join代码,谁就是当前环境)上下文,直到t线程执行完成(主线程去做)
    #     t.join()
    #只有当t的线程执行完成才会执行
    print("ending..............")
main()
输出:
this is run time
ending..............
函数执行花了0.0029897689819335938s

自定义线程类

在使用threading模块时,也可以定义一个新的类class,继承threading.Thread,然后重写run()。

threading.Thread类中的run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法。创建自己的线程实例后,通过Thread类的start方法,可以启动该线程。

import threading
class MYThread(threading.Thread):#继承threading.Thread
    def __init__(self,num):
        super(MYThread,self).__init__()
        self.num=num
    def run(self):#重写run方法
        print(f"running on numbers:{self.num}")

t1=MYThread(1)
t2=MYThread(2)
t1.start()
t2.start()
输出:
running on numbers:1
running on numbers:2

Process finished with exit code 0

标签:get,python,content,threading,线程,模块,time,start
From: https://blog.51cto.com/u_12760266/6346555

相关文章

  • 003 Python 学习笔记
    """-----------bool运算符、比较运算符学习----------bool运算符Ture/False,注:Ture本质上是一个数字即1,False是0使用方式:bool或使用比较运算符(>、<、=、>=、<=、==)字符串可拼接,bool不可拼接"""isSuccess=Trueprint(f"isSuccess={isSuccess}")isOk=10......
  • 盘点一个VScode中Python解释器选择的问题
    大家好,我是皮皮。一、前言前几天在Python最强王者群【PythonPie】问了一个Python解释器的问题,这里拿出来给大家分享下。二、实现过程这里【Ineverleft】问了【ChatGPT】,并给出了答案,如下所示:这可能是由于Conda环境未正确配置或更新导致的问题。您可以尝试重新安装和配置Cond......
  • Android tcp、okhttp请求&&python tcp&&a bytes-like object is required, not ‘str
    更多内容欢迎来到我的新博客blog.devilwst.top更多内容欢迎来到我的新博客blog.devilwst.top首先声明一下,本文部分代码来自于博客AndroidpublicstaticvoidGetByHttpURL(finalStringurl){newThread(newRunnable(){@Overridepublicvo......
  • OverTheWire攻关过程-Bandit模块27
    我们打开lv26-lv27,查看信息机器翻译好工作得到一个壳!现在赶紧抢匪27的密码!我们登陆服务器我们发现一登录就发现断开猜想,有没有可能跟25关卡一样由于tabby的窗口不是系统的原生窗口我们输入V,进入编辑模式:setshellsh=/bin/sh使用ls查看文件可以看到有sudo执行的文件使用命令./ban......
  • XML文件批量合并成Excel表格(Python)
    importosimportxml.etree.ElementTreeasETimportpandasaspdfolder_path="C:/xxx/Desktop/2022"#替换为你的文件夹路径#获取文件夹中的所有文件file_list=os.listdir(folder_path)#创建一个空的DataFrame来存储所有XML文件的数据all_data=pd.DataFra......
  • Python 自动化爬虫利器 Playwright
    Python自动化爬虫利器PlaywrightPythonPlaywright是一个基于Node.js的自动化测试库,它支持多种浏览器(Chrome、Firefox、Safari、Edge等),并提供了一些方便的API来模拟用户在浏览器中的行为。本篇将介绍PythonPlaywright库的基本使用教程。安装首先需要安装PythonPlay......
  • python:Error: EPERM: operation not permitted, mkdir 'F:\Program Files\nodejs\n
     可以发现文件没有权限npmERR!Error:EPERM:operationnotpermitted,mkdir'F:\ProgramFiles\nodejs\node_global\node_modules'将nodejs的文件权限改为完全控制之后操作即可 ......
  • 用Python设计第一个游戏
    代码展示"""用Pyhon设计第一个游戏"""print("游戏开始了家人们")temp=input("大家来猜一猜我心里面想的哪个数字,")guwss=int(temp)ifguess==666;print("你是小昂肚子里的蛔虫嘛?!")print("哎呦喂!猜对了,奖励你写一段代码吧")else:print("......
  • OverTheWire攻关过程-Bandit模块26
    我们打开lv25-lv26,查看信息使用机器翻译从bandit25登录bandit26应该相当容易......用户bandit26的shell不是/bin/bash,而是别的东西。找出它是什么,它是如何工作的,以及如何打破它。您可能需要解决此级别的命令ssh,cat,more,vi,ls,id,pwd可以知道,可能是已登录就被踢出所以我们了解下信息登......
  • 用python查找文件
    查找特定路径下的文件点击查看代码importos#显示当前路径路径=os.getcwd()print(路径)for文件inos.scandir(放入要查询的目录):#这个方法遍历文件比较快,比较好用#文件.name查询文件名字,文件.path查询文件路径,还有其他方法可以查询文件的其他信息,很方便的找特定......