线程与守护线程

线程

1,生产者消费者模型

  1. 什么是生产者与消费者模型

    • 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题,生产者和消费者之间不直接通讯,而通过阻塞队列来通讯,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力
    • 在并发编程中使用生产者和消费者模式能够解决大多数并发问题,该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度
  2. 基于队列(容器)实现生产者和消费者模型

2,线程

  1. 定义

    • 进程是一个资源单位,线程是CPU上的执行单位
    • 一个进程里面开多个线程,共享一个进程里面的内存空间数据

3,开启线程的两种方式

  1. 进程的开启必须是在main下开启,但是线程的开启不是一定在main下开启
  2. 第一种:在main下开启,和进程的开启方式一样
    1. 1 1.创建线程的开销比创建进程的开销小,因而创建线程的速度快
      2 from multiprocessing import Process
      3 from threading import Thread
      4 import os
      5 import time
      6 def work():
      7     print('<%s> is running'%os.getpid())
      8     time.sleep(2)
      9     print('<%s> is done'%os.getpid())
      11 if __name__ == '__main__':
      12     t=Thread(target=work,)
      14     t.start()
      15     print('主',os.getpid())
  3. 第二种:继承与Thread类方式的开启
    1. 1 from threading import Thread
      2 import time
      3 class Work(Thread):
      4     def __init__(self,name):
      5         super().__init__()
      6         self.name = name
      7     def run(self):
      8         # time.sleep(2)
      9         print('%s say hell'%self.name)
      10 if __name__ == '__main__':
      11     t = Work('egon')
      12     t.start()
      13     print('主')

线程vs进程的对比

  1. 开启一个进程,会在内存中开辟一个口进程空间,将主进程的数据全部复制一份,通过线程执行代码
  2. 创建线程的开销比进程小,创建进程需要开空间,而线程存在于进程里面,线程不需要开空间
  3. 同一个进程内的多线程之间可以共享数据,进程与进程之间是相互空间隔离的,需借助队列的方法实现通行
  4. 同一个进程下开多个子进程的pid是不同的,但是开多个线程的pid是相同的

线程的相关其他方法

  1. Thread实例对象方法

    • isAlive() :返回线程是否是活动的
    • getName():返回线程名
    • setName():设置线程名
  2. threading模块提供的一些方法
    • threading.currentThread():返回当前的线程变量
    • Threadind.enumerate(): 返回一个正在运行的线程的list
    • threading.activeCount():返回正在运行的线程数量,与len(Threadind.enumerate())有相同的效果
  3. 其他属性
    • 1 from  threading import Thread
       2 from multiprocessing import Process
       3 import time,os,threading
       4 def work():
       5     time.sleep(2)
       6     print('%s is running' % threading.currentThread().getName())
       7     print(threading.current_thread()) #其他线程
       8     print(threading.currentThread().getName()) #得到其他线程的名字
       9 if __name__ == '__main__':
      10     t = Thread(target=work)
      11     t.start()
      12
      13     print(threading.current_thread().getName())  #主线程的名字
      14     print(threading.current_thread()) #主线程
      15     print(threading.enumerate()) #连同主线程在内有两个运行的线程
      16     time.sleep(2)
      17     print(t.is_alive()) #判断线程是否存活
      18     print(threading.activeCount())
      19     print('主')
      

守护线程

  1. join与守护线程

    • 主进程等所有的非守护的子进程结束他才结束(回收他的字进程资源):有父子关系
    • 主线程等非守护线程全部结束它才结束:没 父子关系
  2. 守护线程与守护进程的区别
    • 守护进程:主进程会等到所有的非守护进程结束,守护进程随着主进程的结束也结束
    • 守护线程:主线程等到非守护线程全部结束才结束,
  3. 实例
    • from  multiprocessing import Process
      from threading import Thread,currentThread
      import time,os
      def talk1():
          time.sleep(2)
          print('hello')
      def talk2():
          time.sleep(2)
          print('you see see')
      if __name__ == '__main__':
          t1 = Thread(target=talk1)
          t2 = Thread(target=talk2)
          # t1 = Process(target=talk1)
          # t2 = Process(target=talk2)
          t1.daemon = True
          t1.start()
          t2.start()
          print('主线程',os.getpid())
      ########################################
      主线程 11288
      you see see
      hello
      ###############或者##################3
      主线程 5664
      hello
      you see see
    • #3 --------迷惑人的例子
      from threading import Thread
      import time
      def foo():
          print(123)
          # time.sleep(10) #如果这个等的时间大于下面等的时间,就把不打印end123了
          time.sleep(2)  #如果这个等的时间小于等于下面等的时间,就把end123也打印了
          print('end123')
      def bar():
          print(456)
          # time.sleep(5)
          time.sleep(10)
          print('end456')
      if __name__ == '__main__':
          t1 = Thread(target=foo)
          t2 = Thread(target=bar)
          t1.daemon = True #主线程运行完了守护的那个还没有干掉,
          # 主线程等非守护线程全都结束它才结束
          t1.start()
          t2.start()
          print('main---------')
      #############大于##################
      123
      456
      main---------
      end456
      ##############小于等于#############
      123
      456
      main---------
      end123
      end456

原文地址:https://www.cnblogs.com/daviddd/p/12034410.html

时间: 2025-01-17 16:19:26

线程与守护线程的相关文章

Java用户线程和守护线程

1.用户线程和守护线程的区别用户线程和守护线程都是线程,区别是Java虚拟机在所有用户线程dead后,程序就会结束.而不管是否还有守护线程还在运行,若守护线程还在运行,则会马上结束.很好理解,守护线程是用来辅助用户线程的,如公司的保安和员工,各司其职,当员工都离开后,保安自然下班了. 2.用户线程和守护线程的适用场景由两者的区别及dead时间点可知,守护线程不适合用于输入输出或计算等操作,因为用户线程执行完毕,程序就dead了,适用于辅助用户线程的场景,如JVM的垃圾回收,内存管理都是守护线程,

Java:多线程&lt;四&gt; Lock、停止线程、守护线程、join、优先级&amp;yield

Java1.5以后,Condition将Object监视器方法(wait, notify, notifyAll)分解成截然不同的对象,以便通过这些对象与任意Lock实现组合使用为每个对像提供多个等待set(wait-set).期中,Lock替代了synchronized方法和语句的使用,Condition替代了Objetc监视器方法和使用. 当线程处于冻结状态,就有可能线程就不会结束,interrupt用于清除线程的冻结状态.当没有指定的方式让冻结状态的线程恢复到运行状态时,这是需要对冻结状态进

001-多线程基础-进程线程、线程状态、优先级、用户线程和守护线程

一.进程与线程 1.DOS系统[单进程系统] 最早的时候DOS有一个特点:只要电脑有病毒,那么电脑就死机了. 原因:传统的DOS系统属于单进程系统,即:在同一时间段内只允许有一个程序运行. 2.Windows系统[多进程多线程] 电脑中毒也可以运行,但是会变慢 原因:因为在一个cpu.一块资源的情况下,程序利用一些轮转算法,可以让一个资源在一个时间段可以同时处理多个程序(进程),但是在一个时间点上只允许一个进程去执行. windows:任务管理器 linux:ps 在每一个进程上可以划分出若干个

JAVA笔记13__创建线程/线程休眠/等待线程终止/线程中断/守护线程

/** * 线程:是进程的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个进程(单线程程序) * 多线程两种实现方法:1.继承Thread类 2.实现Runnable接口 */ public class Main { public static void main(String[] args) { MyThread t1 = new MyThread(); t1.start(); //启动线程 System.out.println("main"); S

用户线程和守护线程

在Java中有两类线程:用户线程 (User Thread).守护线程 (Daemon Thread). 所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分.因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程.反过来说,只要任何非守护线程还在运行,程序就不会终止.用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护

多线程 线程池 守护线程

守护线程只是个概念问题,一句话可以总结(不知道总结的对不对^_^); 当所有用户线程都结束的时候,守护线程也就结束了,当有用户线程存在的时候,守护线程就是一个普通线程. main线程不可以设置成守护线程,应为只有在线程调用start方法前,才可以设置线程为守护线程,main线程是jvm创建的 多线程以及线程池的问题 import java.io.DataInputStream; import java.io.File; import java.io.FileOutputStream; impor

36 线程 队列 守护线程 互斥锁 死锁 可重入锁 信号量

线程 线程是操作系统最小的运算调度单位,被包含在进程中,一个线程就是一个固定的 执行流程 线程和进程的关系 线程不能单独存在 必须存在于进程中, 进程是一个资源单位,其包含了运行程序所需的所有资源 线程才是真正的执行单位 没有线程,进程中的资源无法被利用起来,所以一个进程至少包含一个线程,称之为主线程 当我们启动一个程序时,操作系统就会自己为这个程序创建一个主线程 线程可以由程序后期开启 ,自己开启线程称之为子线程 为什么需要线程 目的只有一个就是提高效率 就像一个车间 如果产量跟不上 就再造一

java并发:初探用户线程和守护线程

用户线程和守护线程 用户线程 用户线程执行完,jvm退出.守护线程还是可以跑的 /** * A <i>thread</i> is a thread of execution in a program. The Java * Virtual Machine allows an application to have multiple threads of * execution running concurrently. * <p> * Every thread has

119 python程序中的线程操作-守护线程

一.守护线程 无论是进程还是线程,都遵循:守护xx会等待主xx运行完毕后被销毁.需要强调的是:运行完毕并非终止运行. 对主进程来说,运行完毕指的是主进程代码运行完毕 对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕 1.1 详解 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束. 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被

java 用户线程和守护线程

在Java中通常有两种线程:用户线程和守护线程(也被称为服务线程)通过Thread.setDaemon(false)设置为用户线程通过Thread.setDaemon(true)设置为守护线程线程属性的设置要在线程启动之前,否则会报IllegalThreadStateException异常如果不设置线程属性,那么默认为用户线程 用户线程和守护线程的区别: 1.主线程结束后用户线程还会继续运行,JVM存活 2.如果没有用户线程,都是守护线程,那么JVM结束(所有的线程都会结束) 守护进程(Daem