欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Python|Multithreading|多线程

时间:2023-05-21
1、一个简单的多线程

from threading import Threadimport timedef 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 ThreadStart Sub Thread: 0Start Sub Thread: 1Start Sub Thread: 2End Main Thread########## Result End ##########

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

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

from threading import Threadimport timedef 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 ThreadEnd Main ThreadStart Sub Thread: 1Start Sub Thread: 2Start Sub Thread: 0########## Result End #################### Result Begin ##########Start Main ThreadEnd Main ThreadStart Sub Thread: 1Start Sub Thread: 0Start Sub Thread: 2########## Result End ##########

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

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

from threading import Threadimport timedef 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 ThreadStart Sub Thread: 1Start Sub Thread: 0Start Sub Thread: 2End Main Thread########## Result End ##########

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

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。