python学习笔记——Thread常用方法

devtools/2025/3/6 0:03:17/

Thread对象中的一些方法:

以前说过多线程,用到threading模块中的Thread对象,其中的start和run方法比较熟悉了,start()是重载了Thread对象中的run方法,其实作用还是,当执行这个start方法的时候,将运行run方法。今天看看其他几个重要的方法:

1 join方法,如果一个线程或者一个函数在执行过程中要调用另外一个线程,并且待到其完成以后才能接着执行,那么在调用这个线程时可以使用被调用线程的join方法。

join([timeout])

里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个线程有没有执行完毕,主线程或函数都会接着执行的。

看个例子:

import threading

import time

class MyThread(threading.Thread):

  def __init__(self,id):threading.Thread.__init__(self)self.id=iddef run(self):x=0time.sleep(20)print self.id

def func():

  t.start()for i in range(5):print i

t=MyThread(2)

func()

0

1

2

3

4

2

可以看到,虽然在func里面线程已经运行,但是函数并没有等线程运行结束在执行,而是先把func执行完毕,打印0到4,然后等sleep(20),20秒结束后,这个MyThread(2),传进去的2才打印出。

def func():

  t.start()t.join()for i in range(5):print i

t=MyThread(3)

func()

3

0

1

2

3

4

而这个呢,是当t.start()运行开始计时,20秒后,打印出id是3,然后func才接着运行,打印出0到4.

  1. setDaemon()方法

这个方法基本和join是相反的。当我们在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法啦,

下面的例子就是设置子线程随主线程的结束而结束:

import threading

import time

class myThread(threading.Thread):

def __init__(self,threadname):threading.Thread.__init__(self,name=threadname)def run(self):time.sleep(5)print self.getName()

def fun1():

t1.start()print 'fun1 done'

def fun2():

t2.start()print 'fun2 done'

t1=myThread(‘t1’)

t2=myThread(‘t2’)

t2.setDaemon(True)

fun1()

fun2()

上面这个例子,按照我们设想的输出时:
fun1 done

fun2 done

t1

但是实际上我们在交互模式,主线程只有在python退出时终止,所以结果t2也是被打印出来啦。

3 .isAlive方法

当线程创建以后,可以使用Thread对象的isAlive方法查看线程是否运行。

import threading

import time

class myThread(threading.Thread):

   def __init__(self,id):threading.Thread.__init__(self)self.id=iddef run(self):time.sleep(5)print self.id

t=myThread(1)

def func():

   t.start()print t.isAlive()

func()

True

1

  1. 线程名

当线程创建后可以设置线程名来区分不同的线程,以便对线程进行控制。线程名可以在类的初始化函数中定义,也可以使用Thread对象的setName方法设置。下面是不同的方法来设置线程名。

import threading

class mythread(threading.Thread):

   def __init__(self,threadname):threading.Thread.__init__(self,name=threadname)def run(self):print self.getName()

t1=mythread(‘t1’)

t1.getName()

‘t1’

t1.setName(‘T’)

t1.getName()

‘T’

t2=mythread(‘t2’)

t2.start()

t2

t2.getName()

‘t2’

t2.setName(‘TT’)

t2.getName()

‘TT’


http://www.ppmy.cn/devtools/164864.html

相关文章

第十五届蓝桥杯:dfs之数字接龙

#include <iostream> using namespace std; const int N 300; int a[N][N];//存值 int b[N][N];//判断某个点是否出现过 int n,k; string path; int dx[] {-1,-1,0,1,1,1,0,-1}; int dy[] {0,1,1,1,0,-1,-1,-1}; bool dfs(int x,int y,int cur,int pos) {if(pos n*n…

本地部署 DeepSeek:从 Ollama 配置到 Spring Boot 集成

前言 随着人工智能技术的迅猛发展&#xff0c;越来越多的开发者希望在本地环境中部署和调用 AI 模型&#xff0c;以满足特定的业务需求。本文将详细介绍如何在本地环境中使用 Ollama 配置 DeepSeek 模型&#xff0c;并在 IntelliJ IDEA 中创建一个 Spring Boot 项目来调用该模型…

2025机械考研复试面试问题汇总篇(含13门科目),考研机械复试专业面试常见重点问题总结!考研机械复试专业面试准备看这一篇就够了!

前言——25机械考研复试专业面试问题汇总 机械复试超全流程攻略 机械复试看这一个专栏就够用了!机械复试调剂英语自我介绍口语专业面试常见问题总结 机械保研面试-CSDN博客https://blog.csdn.net/weixin_56510835/article/details/143101233 本专栏包含的所有文章内容,可以看…

AI辅助学习vue第十四章

第十四章&#xff1a;技术引领与未来展望 在第十五章&#xff0c;你已经在Vue技术领域深耕许久&#xff0c;积累了丰富的经验与卓越的影响力。此时&#xff0c;你将站在行业前沿&#xff0c;引领技术走向&#xff0c;为Vue技术的未来发展开辟新道路。 1. 引领Vue技术发展方向…

Go 语言大数据处理应用

Go 语言在大数据处理领域的完整技术解决方案&#xff0c;包含架构设计、核心实现和性能优化策略&#xff1a; 一、大数据处理架构设计 ┌─────────────┐│ 数据源 ││(Kafka/日志文件)│└──────┬──────┘▼┌─────────────┐│…

基于JAVA+SpringBoot+Vue的前后端分离的高校校园点餐系统

基于JAVASpringBootVue的前后端分离的高校校园点餐系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&…

Android Studio安装教程

一、找到官网下载路径 进入官网后 往下翻&#xff0c;进入下载归档选择自己要下载的版本&#xff1a; 我下载的是这一版的&#xff0c;据说更为稳定&#xff1a; 这里有两种下载方式&#xff1b;下载程序和压缩包两种。&#xff08;推荐下载程序&#xff09; 前期直接点下一步即…

Linux12-TCP\HTTP

一、TCP粘包问题 1.TCP在接受数据时&#xff0c;多包数据粘在一起 2.原因&#xff1a; 2.1TCP发送数据时&#xff0c;会根据缓冲区数据的情况进行重新组包 2.2TCP接收方&#xff0c;没有及时读走缓冲区数据&#xff0c;导致缓冲区大量数据缓存。 3.如何解决 3.1发指定大小字…