py并发_threading实现多线程笔记

threading

threading 是 Python3之后开始推荐使用的一种多线程的实现模块,其最大的特点是可以采用与多进程编写几乎相同的形式来实现多线程的开发,同时内部也提供有大量方便的开发工具,使得Python多线程执行更加方便,同步处理也更加的容易。

threading是一个最新的多线程实现模块,拥有更加方便的线程控制以及线程同步支持,在此模块之中提供有一个Thread类实现线程的相关处理操作。

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# coding : UTF-8
import threading,time
def thread_handle(delay): # 定义多线程的处理函数
for num in range(5):
time.sleep(delay) #追加一个延迟操作
print("[%s]num = %s" % (threading.current_thread().name, num)) # 输出提示信息
def main(): # 主函数
for item in range(5): # 通过循环的形式创建线程
# 创建一个新的线程对象,设置好该线程对象的处理函数以及参数内容,并且配制好线程名称
thread = threading.Thread(target=thread_handle,args=(1,),name="执行线程 - %s" % item)
thread.start() # 启动线程
print("主线程ID:%s、主线程名称:%s" % (threading.current_thread().ident,threading.current_thread().name))
print("当前活跃线程个数:%s" % threading.active_count()) # 存活的线程个数
print("当前活跃线程信息:%s" % threading.enumerate()) # 线程信息
if __name__ == "__main__": # 判断程序执行名称
main()

主线程ID:4672、主线程名称:MainThread
当前活跃线程个数:6
当前活跃线程信息:[<_MainThread(MainThread, started 4672)>, <Thread(执行线程 - 0, started 21808)>, <Thread(执行线程 - 1, started 21780)>, <Thread(执行线程 - 2, started 20856)>, <Thread(执行线程 - 3, started 20820)>, <Thread(执行线程 - 4, started 21856)>]
[执行线程 - 2]num = 0[执行线程 - 4]num = 0
[执行线程 - 1]num = 0

[执行线程 - 0]num = 0
[执行线程 - 3]num = 0
[执行线程 - 1]num = 1[执行线程 - 2]num = 1[执行线程 - 3]num = 1

[执行线程 - 4]num = 1

[执行线程 - 0]num = 1
[执行线程 - 1]num = 2[执行线程 - 4]num = 2
[执行线程 - 3]num = 2
[执行线程 - 0]num = 2

[执行线程 - 2]num = 2
[执行线程 - 2]num = 3
[执行线程 - 1]num = 3
[执行线程 - 3]num = 3
[执行线程 - 4]num = 3
[执行线程 - 0]num = 3
[执行线程 - 4]num = 4[执行线程 - 0]num = 4

[执行线程 - 1]num = 4
[执行线程 - 3]num = 4[执行线程 - 2]num = 4

进程已结束,退出代码0

在Python程序中main既是主进程,也是主线程,所有的通过它创建的进程或者是线程都属于子进程或者是子线程。

Python除了基本的面向函数的开发支持之外,实际上还提供有面向对象的处理支持,如果开发者有需要也可以利用线程类的形式来定义线程的相关处理,这个时候只需要继承“threading.Thread”类,随后覆写run()方法即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# coding : UTF-8
import threading, time
class MyThread(threading.Thread):
def __init__(self,thread_name,delay):
super().__init__(name=thread_name) # 将线程名称传递到父类构造
self.__delay = delay # 保存延迟时间
def run(self): # 线程的主题方法
for num in range(5):
time.sleep(self.__delay) # 线程执行延迟
print("[%s] num = %s" % (threading.current_thread().getName(),num))
def main(): # 主函数
for item in range(10): #通过循环的形式创建线程
thread = MyThread("执行线程 - %s" % item, 1) # 实例化线程类对象
thread.start() # 启动多线程
if __name__ == "__main__": # 判断程序执行名称
main()

[执行线程 - 5] num = 0
[执行线程 - 3] num = 0
[执行线程 - 0] num = 0[执行线程 - 1] num = 0
[执行线程 - 6] num = 0[执行线程 - 4] num = 0
[执行线程 - 2] num = 0

[执行线程 - 9] num = 0[执行线程 - 8] num = 0[执行线程 - 7] num = 0

[执行线程 - 2] num = 1[执行线程 - 6] num = 1
[执行线程 - 5] num = 1
[执行线程 - 4] num = 1
[执行线程 - 0] num = 1[执行线程 - 3] num = 1

[执行线程 - 1] num = 1
[执行线程 - 9] num = 1
[执行线程 - 8] num = 1
[执行线程 - 7] num = 1
[执行线程 - 5] num = 2[执行线程 - 1] num = 2
[执行线程 - 6] num = 2
[执行线程 - 4] num = 2[执行线程 - 2] num = 2

[执行线程 - 3] num = 2
[执行线程 - 0] num = 2

[执行线程 - 7] num = 2[执行线程 - 9] num = 2[执行线程 - 8] num = 2

[执行线程 - 5] num = 3[执行线程 - 6] num = 3
[执行线程 - 1] num = 3
[执行线程 - 4] num = 3
[执行线程 - 0] num = 3

[执行线程 - 2] num = 3
[执行线程 - 3] num = 3
[执行线程 - 9] num = 3
[执行线程 - 8] num = 3
[执行线程 - 7] num = 3
[执行线程 - 1] num = 4[执行线程 - 5] num = 4
[执行线程 - 3] num = 4[执行线程 - 4] num = 4
[执行线程 - 2] num = 4
[执行线程 - 0] num = 4
[执行线程 - 6] num = 4

[执行线程 - 9] num = 4[执行线程 - 7] num = 4
[执行线程 - 8] num = 4

进程已结束,退出代码0

守护线程

以上所实现的多线程都属于前台线程,如果有需要开发者也可以定义守护线程,所有的守护线程会随着程序同时存在,如果程序执行完毕了,那么守护线程也会消失。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# coding : UTF-8
import threading, time
class MyThread(threading.Thread):
def __init__(self,thread_name,delay,count):
super().__init__(name=thread_name) # 将线程名称传递到父类构造
self.__delay = delay # 保存延迟时间
self.__count = count # 线程的执行次数
def run(self): # 线程的主题方法
for num in range(self.__count):
time.sleep(self.__delay) # 线程执行延迟
print("[%s] num = %s" % (threading.current_thread().getName(),num))
def main(): # 主函数
user_thread = MyThread("用户线程",2,5) # 示例化线程类对象
daemon_thread = MyThread("守护线程",1,999) # 守护线程
daemon_thread.setDaemon(True) # 线程设置为守护线程
user_thread.start()
daemon_thread.start()
if __name__ == "__main__": # 判断程序执行名称
main()

[守护线程] num = 0
[用户线程] num = 0
[守护线程] num = 1
[守护线程] num = 2
[用户线程] num = 1
[守护线程] num = 3
[守护线程] num = 4
[用户线程] num = 2
[守护线程] num = 5
[守护线程] num = 6
[用户线程] num = 3
[守护线程] num = 7
[守护线程] num = 8
[用户线程] num = 4

进程已结束,退出代码0

当程序之中的用户线程执行完毕之后(主线程执行完毕了)则对应的守护线程也会自动消失


py并发_threading实现多线程笔记
https://blog.wangxk.cc/2020/02/03/py并发-threading实现多线程笔记/
作者
Mike
发布于
2020年2月3日
许可协议