Python多线程的创建,相关函数和守护线程的理解

一:多线程的创建

threading库创建线程有两种方式,函数式和继承式
    1)函数式

  • def func():
  • print ‘Starting‘
  • print ‘Ending‘
  • t=threading.Thread(name=‘func‘,target=func)
  • t.start()

2)继承式

  • class ThreadClass(threading.Thread):
  • def __init__(self, group = None, target = None, name = None, args = (), kwargs = {}):
  • threading.Thread.__init__(self, group, target, name, args, kwargs)
  • def run(self):
  • print ‘Starting‘
  • print ‘Ending‘
  • t = ThreadClass()
  • t.start()

Thread类的构造函数定义如下:

        class threading.Thread(group=Nonetarget=Nonename=Noneargs=()kwargs={})

group:留作ThreadGroup扩展使用,一般赋值NULL

target:就是新建线程要执行的任务函数名

name:线程的名字,也可使用getName(),setName()获取或者修改

args:tuple参数

kwargs:dictionary参数

二:相关函数

1)start():启动线程;

2)join():主线程阻塞住,等待调用该函数的线程结束。join的参数是一个数字,如果非零就表示在此时间后,如果调用join的线程没有结束join函数也返回;

3)is_alive(), isAlive(),判断线程是否结束;

4)setDaemon(),设置函数为守护线程

  • class ThreadClass(threading.Thread):
  • def __init__(self, group = None, target = None, name = None, args = (), kwargs = {}):
  • threading.Thread.__init__(self, group, target, name, args, kwargs)
  • def run(self):
  • while True:
  • dosometing()......
  • t = ThreadClass()
  • t.setDaemon(True)
  • t.start()
  • while True:
  • if not t.is_alive():
  • print "t is dead"
  • exit(1)
  • time.sleep(60)
  • t.join()

三:守护线程

守护线程的概念有点不同于Linux环境下的概念,可能是我没理解,但是这个概念和Java里的守护线程一样:

守护线程在主线程退出后也会随着退出,非守护线程则不会。什么意思呢?

对于普通线程,如果线程的任务没有结束,主线程不会退出,整个程序也不会退出;

对于守护线程,即使线程任务还没有结束,如果主线程退出该线程也会退出;

(不知道这样的理解对不对,实验一下)

  • #--encoding=‘utf-8‘--
  • import logging
  • import threading
  • import time
  • logging.basicConfig(
  • level=logging.DEBUG,
  • format=‘(%(threadName)-10s) %(message)s‘,
  • )
  • def ThreadFunc():
  • logging.debug(‘ Starting‘)
  • file_object = open(‘thefile.txt‘, ‘w+‘)
  • while True:
  • file_object.write(‘wahaha\r\n‘)
  • file_object.flush()
  • time.sleep(1)
  • logging.debug(‘ Existing‘)
  • file_object.close( )
  • t=threading.Thread(name=‘ThreadFunc‘,target=ThreadFunc)
  • #t.setDaemon(True)
  • t.start()
  • time.sleep(5)

1)首先注释掉d.setDaemon(True),也就是d是一个普通线程

执行之后,主线程本该在5秒后退出,但是却发现该线程还是不断的输入wahaha,该脚本一直运行直到kill掉改脚本的执行。此时Ctrl+c也无效,只有kill。

2)删除d.setDaemon(True)前面的#,也就是d是一个守护线程

执行之后,主线程在5秒后退出,线程d只输出少于五个wahah之后也随着主线程的退出而退出,整个脚本退出。在退出前Ctrl+c有效。

时间: 2024-10-18 22:41:54

Python多线程的创建,相关函数和守护线程的理解的相关文章

Java 多线程(四)之守护线程(Daemon)

定义 Java 中有两种线程: 一种是用户线程(User Thread),一种是守护线程(Daemon Thread). 守护线程是一种特殊的线程, 它的特殊有"陪伴"的含义, 当线程中不存在非守护线程时, 则守护线程自动销毁. 垃圾回收线程就是一种守护线程, 当线程中没有非守护线程了, 则垃圾回收线程就会自动销毁. 因此, 守护线程的作用就是为其他非守护线程的线程服务, 当非守护线程不存在时, 其自然就没有存在的必要了. 如何创建 创建过程与一般的线程一样, 只需要在创建完之后调用如

关于java多线程中守护线程的理解

在java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程.下面的方法就是用来设置守护线程的. 1 Thread daemonTread = new Thread(); 2 3 // 设定 daemonThread 为 守护线程,default false(非守护线程) 4 daemonThread.setDaemon(true); 5 6 // 验证当前线程是否为守护线程,返回 tr

java守护线程的理解

package daemonThread; /*setDaemon(true)方法将线程设置为守护线程,线程的Daemon默认值为false * 只要当前JVM实例中存在任何一个非守护线程没有结束,守护线程就在工作 * 当进程中不存在非守护线程,则守护线程随着JVM一同结束 * GC(垃圾回收器)就是一个守护线程 * 本例中main线程虽然先结束,但是testThread线程还在工作,所以只有当testThread线程也结束,才停止打印i */ class MyThread extends Th

JAVA 对守护线程的理解

1.在start之前,setDaemon. 该现场就成为守护线程了. 2.守护现线程并不是主线程结束,子线程(守护线程)也跟着结束.而是守护线程在没有用户线程运行的情况伴随着JVM退出而结束. 示例代码: public class Demo { public static void main(String[] args) { //守护现线程并不是主线程结束,子线程(守护线程)也跟着结束.而是守护线程在没有用户线程运行的情况伴随着JVM退出而结束. MyMainThread my=new MyMa

python多线程之创建线程

'''创建线程''' from threading import Thread #定义一个函数 def Foo(arg):     print(arg) #创建一个线程对象,并和上面的函数Foo建立关系,args= 传一个值为100作为参数给Foo函数 print("开始创建线程...") t1 = Thread(target=Foo,args=(100,)) t2 = Thread(target=Foo,args=(200,)) #在执行之前规定哪个线程是主线程 t1.setDaem

Python多线程(threading)学习总结

注:此文除了例子和使用心得是自己写的,很多都是Python核心编程中的原文.原文文风应该能看出来,就不每个地方单独表明出处了. 线程(有时被称为轻量级进程)跟进程有些相似,不同的是,所有的线程运行在同一个进程中,共享相同的运行环境.它们可以想像成是在主进程或"主线程"中并行运行的"迷你进程". 线程有开始,顺序执行和结束三部分.它有一个自己的指令指针,记录自己运行到什么地方.线程的运行可能被抢占(中断),或暂时的被挂起(也叫睡眠),让其它的线程运行,这叫做让步.一个

面试官: 谈谈什么是守护线程以及作用 ?

文章首发自微信公众号: 小哈学Java 个人网站: https://www.exception.site/java-concurrency/java-concurrency-daemon-thread 目录 一.什么是守护线程 二.守护线程的作用及应用场景 三.总结 一.什么是守护线程 守护线程相对于正常线程来说,是比较特殊的一类线程,那么它特殊在哪里呢?别急,在了解它之前,我们需要知道一个问题,那就是: JVM 程序在什么情况下能够正常退出? The Java Virtual Machine

JAVA学习第二十八课(多线程(七))- 停止线程和多线程面试题

重点掌握 /* * wait 和 sleep 区别? * 1.wait可以指定时间也可以不指定 * sleep必须指定时间 * 2.在同步中,对CPU的执行权和锁的处理不同 * wait释放执行权,释放锁    sleep释放执行权,不释放锁 */ //同步里具备执行资格的线程不止一个,但是能得到锁的只有一个,所以能执行的也只有一个 一.停止线程的方式 不可能让线程一直在运行,所以需要让线程停止 1.定义循环结束标记 一般而言,线程运行代码都是循环的,只要控制了循环就可以结束任务 2.使用int

再谈多线程编程(一)——线程的概念、多线程的创建、守护线程、线程状态的转化

1.什么是线程以及多线程与进程的区别 在现代操作在运行一个程序时,会为其创建一个进程.例如启动一个QQ程序,操作系统就会为其创建一个进程.而操作系统中调度的最小单位元是线程,也叫轻量级进程,在一个进程里可以创建多个线程,这些线程都拥有各自的计数器,堆栈和局部变量等属性,并且能够访问共享的内存变量.处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行.因此我们可以这样理解: 进程:正在运行的程序,是系统进行资源分配和调用的独立单位.每一个进程都有它自己的内存空间和系统资源. 线程:是进程中