Python 多线程的运用

为了让萌新们更好的理解什么是多线程,在开始前,我们先来看看下面这段代码:

import time
import datetime
 
def dotask():
    while True:
        print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        time.sleep(5)
 
def main():
    print('main function.')
 
dotask()
main()

dotask 函数的作用是,每隔5秒钟打印当前时间。可是,发现没有,main函数没有被执行,原因是dotask中有无限循环。那有没有什么方法,让dotask在后台执行,不影响我们执行后面的代码呢。

这就是多线程的作用了。

要完完整整的来解释什么是多线程,那可费功夫了,对理论知识有兴趣的朋友们可以去问问度娘,这里我就不讲解了,我们直接上代码,让大家更直观的理解什么是多线程。

在python中创建多线程,有多种方法,这里我们使用threading这个内置库。

threading.Thread(target=FuncName)

上述代码将返回一个线程实例,target参数是一个函数地址,其实还有很多其它参数,后面会说,这里先不管。

我们来改改开头的代码,使用线程来执行dotask函数。

import time
import datetime
 
import threading
 
def dotask():
    while True:
        print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        time.sleep(5)
 
def main():
    print('main function.')
 
t = threading.Thread(target=dotask)
t.start()
 
main()

main函数被执行了,并且dotask函数在main函数执行后还在后台执行,每隔5秒打印当前时间。

线程创建方法 1

import threading
t=threading.Thread(target=func)
t.start()

前文就是使用这种方法实现的。

线程创建方法 2

以继承类的方式创建:

import time
import datetime
import threading
 
class timer(threading.Thread):
    
    def __init__(self):
        super().__init__()
        
    def run(self):
        while True:
            print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
            time.sleep(5)
 
def main():
    print('main function.')
    
t = timer()
t.start()
 
main()

多线程的创建

thread_list = []
thread_count = 5
 
for i in range(thread_count):
    t = threading.Thread(target=dotask)
    thread_list.append(t)
    t.start()

设置和获得线程名称

  • 在实例化的时候指定名称
    t=threading.Thread(name='线程名称')
  • 通过实例来设定
    t.name='线程名称'
    t.setName('线程名称')

启动线程和结束线程

启动线程:

t.start()

线程在执行完代码后会自动退出,但像上文中的循环需要做特殊的处理,让循环可控。

TERMINATE = True
 
def dotask():
    while not TERMINATE:
        pass

判断线程是否存活

t.isAlive()

线程还在执行返回True,否则返回False。

守护线程

设置守护线程:

t.daemon = True
t.setDaemon(True)

主线程默认不是守护线程,因此基于主线程创建的所有线程默认daemon均为False,当没有生存的非守护线程时,整个程序将会退出。简单的说,如果设置成守护线程,基于此线程创建的子线程在此线程结束时均停止。

需要注意的是,设置守护线程只能在线程开始前。

获取daemon状态:

t.isDaemon()

返回True表示为守护线程。

阻塞线程

t.join()

获得当前进程的线程数

import threading

count = threading.activeCount()

通常这个数 >= 2.

获得正在运行的线程

import threading
thread_running_list = threading.enumerate()

会返回一个包含正在运行的线程List。不包含运行前和结束后的线程。

总结

线程的应用其实很简单,本文都是一些简单的功能;将来大家还要学习线程安全,线程同步和异步,线程的通讯,线程的优先级,线程池等。

原创内容,如需转载,请注明出处;

本文地址: https://www.perfcode.com/p/735.html

分类: 计算机技术
推荐阅读:
Golang Web编程入门示例 Go语言内置了Web服务;net/http 标准库中包含有关HTTP协议的所有功能。这其中包括HTTP客户端和HTTP服务端,在本文中,你将发现使用GO创建一个可在浏览器中查看的WEB服务程序非常简单。
PySide6详细中文教程 PySide6是在Python环境下的一套Qt6 API库。使用PySide6可以轻松创建基于Qt6的GUI程序;PySide6由Qt官方维护。
使用pip安装Python PIL库的正确方法 正确使用pip工具安装Python中PIL库的方法如下:
VirtualBox的无缝模式真是太酷了 VirtualBox的无缝模式真的很酷,可以让虚拟机中的系统和Windows系统共享一个窗口,具体是个什么效果,请看下图:
C语言函数大全 C语言标准库是C语言中非常重要的一部分,它包含了许多内置函数,可以为C程序员提供非常有用的功能和工具。标准库函数可以分为几个类别,包括输入输出函数、字符串处理函数、数学函数、时间函数、内存管理函数、文件操作函数等。
PySide6 动态创建按钮数组 动态创建按钮数组在许多场合非常有用,特别是当你需要根据用户输入、数据量或其它条件来生成界面元素时;本片将演示如何使用PySide6来动态的创建按钮数组,并正确响应对应按钮的点击信号;