线程

龄官
• 阅读 771

1.什么是线程

  • 线程,有时被称为轻量进程,是程序执行流的最小单元;
  • 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础;

2.如何定义线程

  • 在Python中,使用threading库来创建线程;
  • 创建进程的语法
threading.Thread(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=None);
  • group:为线程组,但是Python中没有线程组,所以这是保留参数;
  • target:为可调用对象,也就是任务, 可以是函数,如果是实例,那么实例的类必须实现__call__方法;
  • name:指定线程的名称;
  • args、kwargs:给线程任务传递参数、关键字参数;
  • daemon:指定子线程是否需要主线程等待,主线程是non-daemon线程;

3.如何使用线程

# 示例1:
import threading
def worker():
    print('I am worker')
thead_obj = threading.Thread(target=worker, name='worker')
thead_obj.start()
  • Python中的线程没有优先级、线程组、停止、挂起、销毁、恢复的概念;
  • 线程退出的方式有两种:线程任务执行完毕、或线程内部抛出异常;
# 示例1:死循环,会一直执行
import threading
import time

def worker():
    while True:
        time.sleep(1)
        print('我在工作')
    else:
        print('执行完毕')
thread_obj = threading.Thread(target=worker, name='worker')
thread_obj.start()

# 示例3:条件不满足时,程序会执行完毕
import threading
import time
def worker():
    number = 10
    while number:
        time.sleep(1)
        print('我在工作')
        number -= 1
    else:
        print('执行完毕')
thread_obj = threading.Thread(target=worker, name='worker')
thread_obj.start()


# 示例4:参数传递
import threading
import time
def worker(num):
    number = num
    while number:
        time.sleep(1)
        print('我在工作')
        number -= 1
    else:
        print('执行完毕')
thread_obj = threading.Thread(target=worker, name='worker', args=(3,))
thread_obj.start()
  • threading.active_count():依然存活的线程数,包括主线程;
  • threading.current_thread():返回当前线程实例对象;
  • threading.enumerate():返回当前存活的线程对象列表,包括主线程,但是不包括终止线程和未启动线程;
  • threading.main_thread():返回主线程实例对象;
  • threading.get_ident(): 返回当前线程的ID;
# 实例5:线程的threading模块的相关函数
import threading
import time
def showInfo():
    print('active_thread_count = {}'.format(threading.active_count()))
    print('current_thread = {}'.format(threading.current_thread()))
    print('enumerate = {}'.format(threading.enumerate()))
    print('main_thread = {}'.format(threading.main_thread()))
    print('get_ident = {}'.format(threading.get_ident()))
def worker(num):
    number = num
    while number:
        time.sleep(1)
        print('我在工作')
        number -= 1
    else:
        print('执行完毕')
if __name__ == '__main__':
    thread_obj = threading.Thread(target=worker, name='worker', args=(5, ))
    thread_obj.start()
    showInfo()
  • thread_obj.name:属性装饰器实现,获取线程名称;
  • thread_obj.name = 'thread name': 设置线程名称;
  • thread_obj.ident:线程id;
  • thread_obj.is_alive():显示线程是否存活,返回Bool值;
# 示例6:线程实例对象的方法
import threading
import time
def worker(num):
    number = num
    while number:
        time.sleep(1)
        print('我在工作')
        number -= 1
    else:
        print('执行完毕')
if __name__ == '__main__':
    thread_obj = threading.Thread(target=worker, name='worker', args=(5, ))
    thread_obj.start()
    print(thread_obj.name)
    thread_obj.name = 'new worker'
    print(thread_obj.name)
    print(thread_obj.ident)
    print(thread_obj.is_alive())

4.线程start方法和run方法的区别

import threading
import time
def worker(num):
    number = num
    while number:
        time.sleep(1)
        print('我在工作')
        number -= 1
    else:
        print('执行完毕')
if __name__ == '__main__':
    thread_obj = threading.Thread(target=worker, name='worker', args=(5, ))
    thread_obj.start()
    # thread_obj.run()
    print(thread_obj.name)
    thread_obj.name = 'new worker'
    print(thread_obj.name)
    print(thread_obj.ident)
    print(thread_obj.is_alive())
  • start方法会在内存中,启动一个新的线程运行任务;
  • run方法不会启动新的线程,只是在主线程中执行任务;

5.什么是线程安全

  • 一般在使用多线程的时候,如果需要打印线程的信息,不会使用print函数打印,而是使用logging日志模块打印,因为考虑到print函数在打印过程中 可能出现线程的切换;

6.如何确保线程安

  • 使用logging模块,把线程的信息通过日志的形式打印出来;

7.daemon线程和非daemon线程

import threading
import time
def worker(num):
    number = num
    while number:
        time.sleep(1)
        print('{}在工作'.format(threading.current_thread().name))
        number -= 1
    else:
        print('执行完毕')
if __name__ == '__main__':
    thread_obj = threading.Thread(target=worker, name='worker', args=(5, ), daemon=False)
    # thread_obj = threading.Thread(target=worker, name='worker', args=(5,), daemon=True)
    thread_obj.start()
    time.sleep(3)
    print('主线程执行完毕')
  • 线程中有父子的概念,如果在主线程中启动了一个线程,那么主线程就是父线程,启动的这个工作线程就是子线程;
  • 主线程是non-daemon线程,也就是daemon=False, 如果子线程的daemon=False,那么主线程会等待子线程执行完毕,主线程才会终止,如果 为True, 那么主线程将不会等待子线程,而是主线程执行完毕后,子线程就会终止运行;
  • daemon选项必须在启动线程之前设定;

8.线程实例的join方法

import threading
import time
def worker(num):
    number = num
    while number:
        time.sleep(1)
        print('{}在工作'.format(threading.current_thread().name))
        number -= 1
    else:
        print('执行完毕')
if __name__ == '__main__':
    #
    thread_obj = threading.Thread(target=worker, name='worker', args=(5,), daemon=True)
    thread_obj.start()
    thread_obj.join()  # 主线程在此处开始阻塞
    print('主线程执行完毕')
  • 在当前线程中调用另一个线程的join方法,当前线程会在此处被阻塞,直到被调用的线程结束运行或终止,timeout指定被阻塞的时长,如果没有指定 ,那么就一直阻塞直到调用线程终止;

9.timer定时器

threading.Timer(self, interval, function, args=None, kwargs=None)可以创建一个定时任务

import threading
from threading import Timer
def worker():
    print('I am worker !')
# 等3秒后只需
timer = Timer(interval=3, function=worker, )
# 给定时器取名
timer.setName('worker timer')
timer.start()
print(threading.enumerate())
  • Timer是Thread的一个派生类,用于在指定时间后调用一个方法,如果想实现每隔一段时间就调用一个函数的话,就要在Timer调用的函数中,再次 设置Timer;

参考:https://www.9xkd.com/user/pla...

点赞
收藏
评论区
推荐文章
半臻 半臻
3年前
Python基础10——线程、进程、协程
18线程18.1进程和线程进程:打开一个程序至少就会有一个进程。操作系统进行资源分配的基本单位线程:线程是CPU调度的基本单位,每个进程至少都有一个线程。单线程:只有一个线程pythondeffuna():print(123)deffunb():print(456)funa()funb()先执行funa再执行funb多线程线程
DevOpSec DevOpSec
4年前
python多线程原理和详解(一)
python多线程原理和详解线程概念1.线程是什么?线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
Wesley13 Wesley13
3年前
java线程笔记
线程个人理解:线程是一种运行单元,是进程内的拆分(就像一个房子,里面可以有电视在播放、人在吃饭),不同的线程可以同时干不同的事情。其他:进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。协程:协程是比线程的更小的一种程序的拆分,和
限时发布!非科班程序员金三银四求职经历
进程和线程的概念进程是具有独立功能的程序在一个数据集合上运行的过程。进程是系统进行资源分配的单位,实现的操作系统的并发。线程是比进程更小的能独立运行的单位,是  调度的基本单位,实现了进程内部的并发。线程成为了程序执行流的最小单位。进程状态转换图1.创建状态:进程正在被创建。2.就绪状态:进程已经分配到了除  之外的所有资源,只要分配到  就可以开
Wesley13 Wesley13
3年前
Java并发基础
一、多线程基础知识1.进程和线程进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。线程:进程内部的一个独立执行单元;一个进程可以同时并发的运行多个线程,
Stella981 Stella981
3年前
Android IPC(跨进程通信)之AIDL
AndroidIPC(跨进程通信)之AIDLIPC——跨进程通信,是指两个进程之间的数据交换过程。在说IPC的同时我们要知道什么是进程,什么是线程。线程是CPU调度的最小单元,进程可以理解为一个程序或者一个应用。一个进程中可以运行多个线程,而在Android程序中有一个主线程,也叫UI线程。在And
Stella981 Stella981
3年前
300 行代码带你秒懂 Java 多线程!
  线程的概念,百度是这样解说的:  线程(英语:Thread)是操作体系可以进行运算调度的最小单位。它被包括在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一次序的操控流,一个进程中可以并发多个线程,每条线程并行履行不同的使命。在UnixSystemV及SunOS中也被称为轻量进程(LightweightProcesses),但轻量进程
Stella981 Stella981
3年前
Python 浅析线程(threading模块)和进程(process)
    线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务进程与线程什么是线程(threading)?Athreadisanexecutioncontext,whichisall
Wesley13 Wesley13
3年前
Java中多线程并发体系知识点汇总
一、多线程1、操作系统有两个容易混淆的概念,进程和线程。进程:一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。线程:表示程序的执行流程,是CPU调度执行的基本单位;线程有自己的程序计数器、寄存器、堆栈和帧。同一进
Wesley13 Wesley13
3年前
Java 基础夺命连环16问(面试硬核敲门砖 )
说说进程和线程的区别?进程是程序的一次执行,是系统进行资源分配和调度的独立单位,他的作用是是程序能够并发执行提高资源利用率和吞吐率。由于进程是资源分配和调度的基本单位,因为进程的创建、销毁、切换产生大量的时间和空间的开销,进程的数量不能太多,而线程是比进程更小的能独立运行的基本单位,他是进程的一个实体,可以减少程序并发执行时的时间和空间开销,
深入浅出线程池 | 京东云技术团队
一、线程1、什么是线程线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。2、如何创建线程2.1、JAVA中
龄官
龄官
Lv1
天子呼来不上船,自称臣是酒中仙。
文章
4
粉丝
0
获赞
0