Python线程

作者: 开心的小哈 | 来源:发表于2022-09-02 19:12 被阅读0次

概念

什么是进程,在windows操作系统中一个进程就是一个exe或者dll程序、他们相互独立,相互可以通信
一个进程中可以有多个线程,多个线程共享一块内存空间和一组系统资源,系统在各个线程之间切换时,开销要比进程小得多,正应如此,线程被称为轻量级进程;
了解了线程和进程那么我们说说python

python程序中只要有一个线程,这就是主线程,程序启动后由python解释器负责创建主线程,在程序结束后由python解释器负责停止主程序;

线程呢模块--threading

函数常用方法:

  • active_count():返回当前处于活动状态的线程个数。
  • current_thread():返回当前Thread对象
  • main_thread():返回主线程对象,主线程python解释器启动的线程。
import threading

t=threading.current_thread()
print(t.name)
print(threading.active_count())
t= threading.main_thread()
print(t.name)
执行结果
MainThread
1
MainThread

子线程

  • 线程对象:线程对象就是threading模块的线程类Thread或Thread子类所创建的对象。
  • 线程体:线程体是子线程要执行的代码,这些代码会被封装到一个函数中。子线程在启动后会执行线程体。
  • 实现线程体主要有一下两种方式
  1. 自定义函数实现线程体
  2. 自定义线程类实现线程体

代码演示

import threading

import  time

value=[]

def thread_body():
    t=threading.current_thread()
    for n in range(5):
        print('第{}次执行线程{}'.format(n,t.name))
        time.sleep(2)
    print('线程{}执行完成'.format(t.name))

t1=threading.Thread(target=thread_body)
t2=threading.Thread(target=thread_body,name='Myt2Thread')
t1.start()
t2.start()

以及使用继承实现

import threading

import  time

value=[]

class SmallThread(threading.Thread):
    def __init__(self,name):
        super().__init__(name=name)

    def run(self) -> None:
        t=threading.current_thread()
        for n in range(5):
            print('第{}次执行线程{}'.format(n, t.name))
            time.sleep(2)
        print('线程{}执行完成'.format(t.name))

def thread_body():
    t=threading.current_thread()
    for n in range(5):
        print('第{}次执行线程{}'.format(n,t.name))
        time.sleep(2)
    print('线程{}执行完成'.format(t.name))

t1 = SmallThread('t1Thread')
# t1=threading.Thread(target=thread_body)
t2=threading.Thread(target=thread_body,name='Myt2Thread')
t1.start()
t2.start()

线程管理

  • 等待线程执行结束
    有时,一个线程(假设是主线程)需要等待另外一个线程(假设是 t1子线程)执行结束才能继续执行。


    image.png

    使用join方法可以解决该问题,join(timeout=None)设置超时时间,如果没有设置则视为一直等待,如果设置超时后会结束

import threading
import time

value=[]

def thread_body():
    print('子线程开始')
    for n in range(5):
        print('子线程执行')
        value.append(n)
        time.sleep(2)
    print('子线程结束')
print('主线程执行开始')
t1=threading.Thread(target=thread_body)
t1.start()
# t1.join()
print('value={}'.format(value))
print('主线程执行结束')
执行结果
主线程执行开始
子线程开始
子线程执行
value=[0]
主线程执行结束
子线程执行
子线程执行
子线程执行
子线程执行
子线程结束

使用join后

import threading
import time

value=[]

def thread_body():
    print('子线程开始')
    for n in range(5):
        print('子线程执行')
        value.append(n)
        time.sleep(2)
    print('子线程结束')
print('主线程执行开始')
t1=threading.Thread(target=thread_body)
t1.start()
t1.join()
print('value={}'.format(value))
print('主线程执行结束')
执行结果
主线程执行开始
子线程开始
子线程执行
子线程执行
子线程执行
子线程执行
子线程执行
子线程结束
value=[0, 1, 2, 3, 4]
主线程执行结束

线程停止

在线程体结束时,线程就停止了。但在某些业务比较复杂时,会在 线程体中执行一个“死循环”。线程体是否持续执行“死循环”是通过判断 停止变量实现的,“死循环”结束则线程体结束,线程也就结束了。 另外,在一般情况下,死循环会执行线程任务,然后休眠,再执行 ,再休眠,直到结束循环。


image.png
import threading
import time

isrunning=True

def workthread_body():
    while isrunning:
        print('工作线程执行中')
        time.sleep(5)
    print('工作线程执行完毕')

def contorlthread_body():
    global isrunning
    while isrunning:
        comp=input('输入质量暂停')
        if comp == 'exit':
            isrunning=False
            print('控制线程结束')

work=threading.Thread(target=workthread_body)
cont=threading.Thread(target=contorlthread_body)
work.start()
cont.start()


执行结果:

工作线程执行中
输入质量暂停
输入质量暂停
输入质量暂停
输入质量暂停
输入质量暂停工作线程执行中

输入质量暂停
输入质量暂停exit
控制线程结束
工作线程执行完毕

相关文章

  • 11-9 多线程和多进程

    Python的GIL是针对进程还是线程?  是线程 Python多核cpu可以运行多线程吗? Python线程执行...

  • 5-线程(补充)

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • 多线程

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • Python 多线程 threading和multiproces

    Python 多线程 threading和multiprocessing模块 Python中常使用的线程模块 th...

  • Mr.Li--python-系统编程-线程

    线程 多线程--threading python的thread模块是比较底层的模块,python的threadin...

  • Python多线程编程——创建线程的两个方法

    之前的一篇文章:Python多线程编程——多线程基础介绍,主要介绍了线程的基本知识,以及使用Python创建线程的...

  • python系统编程2

    线程 1.1.1 多线程——threading python的thread模块是比较底层的模块,python的th...

  • python的线程模块和基本用法笔记

    python的线程模块和基本用法笔记 python线程中的模块:thread,threading,queue等程序...

  • GIL

    谈谈python的GIL、多线程、多进程 最近在看 Python 的多线程,经常我们会听到老手说:“python下...

  • Python-线程、线程池

    1. Python多线程 python3中常用的线程模块为:_thread(Python2中的thread)、th...

网友评论

    本文标题:Python线程

    本文链接:https://www.haomeiwen.com/subject/urjrnrtx.html