Python多线程自学笔记

倖福魔咒の 提交于 2020-02-12 23:15:21

threading 模块 Thread 类的用法详解

这篇笔记主要是简化了https://blog.csdn.net/briblue/article/details/85101144

如何理解线程

引用知乎上一个高赞的回答
在这里插入图片描述

创建Thread对象有2种方法

直接创建Thread,并通过函数回调处理任务
编写自定义类继承Thread

总结知识

如何给线程赋值名字
如何知道线程是否继续运行
如何提供线程阻塞手段
如何主线程结束的同时子线程也立马结束

1.1创建Thread,并通过函数回调处理任务的方法

这个方法最重要的参数是target,直接上代码

import threading
import time

def test():

    for i in range(5):
        print('test ',i)
        time.sleep(1)


thread = threading.Thread(target=test)
thread.start()

for i in range(5):
    print('main ', i)
time.sleep(1)

代码运行结果

test  0
main  0
main  1
main  2
main  3
main  4
test  1
test  2
test  3
test  4

1.2如何给线程赋值名字

我们在 Thread 对象创建时,构造方法里面赋值。

thread = threading.Thread(target=test,name='TestThread')

1.3 如何知道线程是否继续运行

Thread 的 is_alive() 方法查询线程是否还在运行

import threading
import time

def test():

    for i in range(5):
        print(threading.current_thread().name+' test ',i)
        time.sleep(0.5)

thread = threading.Thread(target=test,name='TestThread')
thread.start()

for i in range(5):
    print(threading.current_thread().name+' main ', i)
    print(thread.name+' is alive ', thread.isAlive())
    time.sleep(1)

结果也显而易见,因为子线程sleep时间比主线程的时间短,所以子线程提前结束,主线程还在继续。

TestThread is alive  True
TestThread test  1
TestThread test  2
MainThread main  1
TestThread is alive  True
TestThread test  3
TestThread test  4
MainThread main  2
TestThread is alive  True
MainThread main  3
TestThread is alive  False
MainThread main  4
TestThread is alive  False

1.4如何提供线程阻塞手段

调用一个 Thread 的 join() 方法,可以阻塞自身所在的线程。
例如:thread.join(1.0)

import threading
import time

def test():

    for i in range(5):
        print(threading.current_thread().name+' test ',i)
        time.sleep(0.5)


thread = threading.Thread(target=test,name='TestThread')
thread.start()
thread.join(1.0)

for i in range(5):
    print(threading.current_thread().name+' main ', i)
    print(thread.name+' is alive ', thread.isAlive())
    time.sleep(1)

运行结果,可见子线程的sleep时间是0.5,join阻塞线程的时间是1,所以子线程的1,2线程被阻塞了,直接从3,4开始。

TestThread is alive  True
TestThread test  3
TestThread test  4
MainThread main  1
TestThread is alive  True
MainThread main  2
TestThread is alive  False
MainThread main  3
TestThread is alive  False
MainThread main  4
TestThread is alive  False

1.5如何主线程结束的同时子线程也立马结束

其实很简单,只需要在子线程调用 start() 方法之前设置 daemon 就好了。

thread.setDaemon(True)
import threading
import time

def test():

    for i in range(5):
        print(threading.current_thread().name+' test ',i)
        time.sleep(2)

thread = threading.Thread(target=test,name='TestThread')
thread.setDaemon(True)
thread.start()

for i in range(5):
    print(threading.current_thread().name+' main ', i)
    print(thread.name+' is alive ', thread.isAlive())
    time.sleep(1)

运行结果,因为子线程的时间设置为2,比主线程是慢的,所以主线程开始了,子线程还没开始,但主线程结束的同时子线程也结束了

TestThread is alive  True
MainThread main  1
TestThread is alive  True
TestThread test  1
MainThread main  2
TestThread is alive  True
MainThread main  3
TestThread is alive  True
TestThread test  2
MainThread main  4
TestThread is alive  True

2. 编写自定义类继承Thread

下面的代码,我们自定义了 TestThread 这个类,然后继承 threading.Thread。只有在 run() 中处理逻辑。添加阻塞和进程同时结束的方法也是和上面一样的

import threading
import time


class TestThread(threading.Thread):

    def __init__(self,name=None):
        threading.Thread.__init__(self,name=name)

    def run(self):
        for i in range(5):
            print(threading.current_thread().name + ' test ', i)
            time.sleep(1)


thread = TestThread(name='TestThread')
thread.start()


for i in range(5):
    print(threading.current_thread().name+' main ', i)
    print(thread.name+' is alive ', thread.isAlive())
    time.sleep(1)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!