Thrading线程
单线程执行代码:
1 import time 2 3 4 def saySorry(): 5 print("测试代码") 6 time.sleep(1) 7 8 9 if __name__ == '__main__': 10 for i in range(5): 11 saySorry()
单线程下程序运行非常慢,且不能同一时间执行不同的功能。使用多线程后执行代码较快,且能同一时间完成多种功能(例如:同时接收和发送数据)
1 import threading 2 import time 3 4 5 def test(): 6 print("测试代码") 7 time.sleep(1) 8 9 10 if __name__ == '__main__': 11 for i in range(5): 12 t = threading.Thread(target=test) 13 t.start() # 调用start方法后才会创建线程以及让这个线程开始运行
查看线程数量:通过查看threading调用enumerate方法的长度 来判断线程的数量
1 print("当前运行的线程数为:%d" %len(threading.enumerate())
线程执行代码的封装:
如果使用多个线程去做同一件事情时,可以将线程执行代码进行封装,当需要执行相应代码时直接用封装的代码创建线程对象,然后调用start方法后即可执行。
1 import threading 2 import time 3 4 5 class MyThred(threading.Thread): 6 def run(self): 7 for i in range(5): 8 time.sleep(1) 9 print("测试代码") 10 11 12 if __name__ == '__main__': 13 t = MyThred() 14 t.start()
多线程共享全局变量:
1 from threading import Thread 2 import time 3 4 g_num = 100 5 6 7 def work1(): 8 global g_num 9 for i in range(3): 10 g_num += 1 11 print("___in worrk1,g_num is %d" % g_num) 12 13 14 def work2(): 15 # global g_num 16 print("___in work2,g_num is %d" % g_num) 17 18 19 print("___线程创建之前,g_num is %d" % g_num) 20 21 22 t1 = Thread(target=work1) 23 t1.start() 24 25 # 延迟一会,保证t1线程中的事情做完 26 time.sleep(0.5) 27 28 t2 = Thread(target=work2) 29 t2.start()
执行结果:
1 ___线程创建之前,g_num is 100 2 ___in worrk1,g_num is 103 3 ___in work2,g_num is 103
补充:threading.Thread()括号内除了传入target=方法名外,还可以用 args=()传入实参到要执行的方法内部,args必须是元组。
1 from threading import Thread 2 import time 3 4 5 def work1(temp): 6 temp.append(33) 7 print("___in work1___", temp) 8 9 10 def work2(temp): 11 print("___in work2___", temp) 12 13 14 g_nums = [11, 22] 15 16 # target指定将来这个线程去哪个函数执行代码 17 # args指定将来调用函数的时候 传递什么数据过去 18 t1 = Thread(target=work1, args=(g_nums,)) # args传入的是一个元组 19 t1.start() 20 time.sleep(1) 21 t2 = Thread(target=work2, args=(g_nums,)) 22 t2.start()
执行结果:
1 ___in work1___ [11, 22, 33] 2 ___in work2___ [11, 22, 33]