Python | Multithreading | 【3分钟】上手多线程

本文探讨了Python中多线程的基本用法,重点介绍了如何通过`join`函数控制子线程执行顺序,以及在子线程执行时间较长时如何保持主线程的流程控制。通过实例展示了如何避免主线程结束过早,确保子线程完成后再执行后续操作。
摘要由CSDN通过智能技术生成

1. 一个简单的多线程

from threading import Thread

import time


def func(i):
    print('Start Sub Thread: %d' % (i))


if __name__ == '__main__':
    print('Start Main Thread')
    thread_list = []
    for i in range(3):
        m = Thread(target=func, args=(i,))
        thread_list.append(m)
    for m in thread_list:
        m.start()
    print('End Main Thread')

##########   Result Begin  ##########
Start Main Thread
Start Sub Thread: 0
Start Sub Thread: 1
Start Sub Thread: 2
End Main Thread
##########   Result End   ##########

这个多线程代码比较简单,但是也不要被输出的顺序结果蒙骗了,因为线程执行的速度太快,导致在启动的时候就执行完成了。
通常线程的执行是系统自动调度的,如果子线程执行时间过长时,会发生什么?

2. 多线程的自动调度(无序)

from threading import Thread

import time


def func(i):
    time.sleep(1)
    print('Start Sub Thread: %d' % (i))


if __name__ == '__main__':

    print('Start Main Thread')
    thread_list = []
    for i in range(3):
        m = Thread(target=func, args=(i,))
        thread_list.append(m)

    for m in thread_list:
        m.start()
    print('End Main Thread')
 
##########   Result Begin  ##########
Start Main Thread
End Main Thread
Start Sub Thread: 1
Start Sub Thread: 2
Start Sub Thread: 0
##########   Result End   ##########


##########   Result Begin  ##########
Start Main Thread
End Main Thread
Start Sub Thread: 1
Start Sub Thread: 0
Start Sub Thread: 2
##########   Result End   ##########

我们会发现当子线程执行时间比较长的时候,子线程的输出顺序每次都不同,这就说明了主线程启动完所有的子线程后会直接关闭,子线程什么时候调度就和主线程没有任何关系了。
那么如果我想子线程启动执行完成后,还要执行一些代码流程,不要让它启动完子线程就结束了,这改如何处理?

3. 子线程加入到主线程中(join)

from threading import Thread

import time


def func(i):
    time.sleep(1)
    print('Start Sub Thread: %d' % (i))


if __name__ == '__main__':

    print('Start Main Thread')
    thread_list = []
    for i in range(3):
        m = Thread(target=func, args=(i,))
        thread_list.append(m)

    for m in thread_list:
        m.start()
    for m in thread_list:
        m.join()
    print('End Main Thread')
    
##########   Result Begin  ##########
Start Main Thread
Start Sub Thread: 1
Start Sub Thread: 0
Start Sub Thread: 2
End Main Thread
##########   Result End   ##########

从上面的例子可以看出,主线程启动了3个子线程后。
由于子线程join到了主线程上,所以主线程必须等待3个子线程都完成后,主线程才会退出。
满足了子线程的自动调度和主线程的顺序流程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比特本特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值