一,什么是多任务
import time import threading # Learner BM """ 什么是多任务,因程序是自上而下的执行,当需要执行2个函数的时候,需要先执行完毕第一个函数, 然后再执行第二个函数,而多任务就是实现两个函数同时执行 并行: 真多任务,CPU数量执行 并发: 假多任务,CPU快速切换 主线程: 执行程序,执行完毕后,会等待子线程执行完毕后在执行 子线程: 主线程执下派生的子线程 多任务执行 通过线程类,创建线程对象,目标为需要执行的函数 t1 = threading.Thread(target= 函数名) t1对象的启动线程方法 t1.start """ # 定义函数 def dance(): for i in range(5): print('老板在跳舞') time.sleep(1) # 定义函数 def sing(): for i in range (5): print('老板在唱歌') time.sleep(1) # 主函数 def mian(): #****调用threading模块的thread类创建对象,(类的参数为 函数变量名) t1 = threading.Thread(target= dance) t2 = threading.Thread(target=dance) t1.start() t2.start() if __name__ == "__main__": mian()
二,o2_线程的特性.py
1 import threading 2 import time 3 # Learner BM 4 "" 5 """ 6 1,线程执行过程是没有顺序的,线程执行的时候是随机的,如果需要控制线程执行的顺序,需要对线程进行延时处理, 7 2,如果需要查看当前线程执行数量,可以使用enumerate函数 8 3,线程的创建与执行,从对象的start方法开始,一个函数的调用结束时,就是线程的生命周期结束完(创建线程对象的时候,不会创建线程) 9 4,子线程先结束后主线程在结束,否则程序出错 10 """ 11 # 定义函数 12 13 def dance(): 14 for i in range(5): 15 print('老板在跳舞') 16 time.sleep(1) 17 # 定义函数 18 def sing(): 19 for i in range (10): 20 print('老板在唱歌') 21 time.sleep(1) 22 # 主函数 23 def mian(): 24 #****调用threading模块的thread类创建对象,(类的参数为 函数变量名) 25 t1 = threading.Thread(target= dance) 26 t2 = threading.Thread(target=dance) 27 t1.start() 28 t2.start() 29 # 30 while True: 31 print(threading.enumerate()) 32 if len(threading.enumerate())<=1: 33 break 34 time.sleep(1) 35 36 if __name__ == "__main__": 37 mian()
o3_线程的封装.py
1 # Learner BM 2 import threading 3 import time 4 """ 5 创建线程有两种方法,一种是直接调用函数名,适合简单的线程调用 6 t1 = threading.Thread(target=函数名) 7 另外一种是封装类进行,过程较为复杂,适合封装 较为复杂,函数较多的类 8 1,封装一个类Mythread,继承threading.Thread类 9 1.1 类内部必须定义run方法 10 1.1.1 run方法内部代码 11 调用其他函数 12 2,主程序执行,创建类的实例对象 13 t1 = Mythread() 14 t1.start() # strat会自动调用类内部的run方法,所以类里面必须定义run 15 16 """ 17 # 封装线程类 18 class MyThread(threading.Thread): 19 # 定义run方法 20 def run(self): 21 for i in range(5): 22 print('run执行') 23 time.sleep(1) 24 def sing(self): 25 for i in range(5): 26 print('唱歌') 27 time.sleep(1) 28 29 # 创建对象 30 t1 = MyThread() 31 t1.start() 32 t1.sing()
o4_线程之间共享全局变量.py
1 import threading 2 """ 3 4 """ 5 """ 6 线程之间,使用的全局变量,是共享的,例如定义一个全局变量num=100,如果在线程1中对num进行修改为101 7 那么线程2访问num时候,num2的值同样是101, 8 9 ############################################ 10 复习,数据类型的可变不可变: 11 12 不可变类型:字符串,数字,元祖 13 可变类型,字典,列表 14 15 区别: 16 17 不可变类型 18 在函数 外部 定义全局变量 19 num=100 20 函数1内部对num进行修改 21 函数2访问num时值同样是100 22 ################################ 23 24 可变类型 25 在函数 外部 定义全局变量 函数 内部 修改 26 list=[1,2,3] 27 函数1内部对list通过方法进行修改 list.append(4) 但是使用赋值语句进行修改时 list = [1,2,3,4] 28 函数2访问list时值同样是[1,2,3,4] 函数2访问list时候,值会变成 [1,2,3,4] 29 ################################ 30 31 32 """ 33 34 # 不可变类型 35 # 定义不可变类型数据 36 37 # 全局变量 38 gl_num = 0 39 def test1(args): 40 # 函数内部需要定义global 41 global gl_num 42 for i in range(args): 43 44 gl_num+=10 45 print('函数1修改不可变类型值为%s' % gl_num) 46 47 def test2(args): 48 global gl_num 49 for i in range(args): 50 51 gl_num += 10 52 print('函数2修改不可变类型值为%s' % gl_num) 53 54 t1 =threading.Thread(target= test1,args=(10000,)) 55 t2 =threading.Thread(target= test2,args=(10000,)) 56 print(gl_num) 57 t1.start() 58 t2.start() 59 """ 60 全局变量在线程之间会共享,容易产生资源竞争,同时修改时容易出现问题 61 """
o5多进程udp聊天器.py
1 # Learner BM 2 # Learner BM 3 import socket 4 import threading 5 """ 6 7 """ 8 """ 9 多线程版本 10 1 创建套接字 11 2,发送函数 12 3,接受函数 13 14 """ 15 # 发送函数 16 def sendmsg(udp_socket): 17 while True: 18 senddata= input('请输入要发送的数据') 19 udp_socket.sendto(senddata.encode('gbk'),('10.3.10.73',8080)) 20 # print('sendmsg') 21 # 接收函数 22 def receivemsg(udp_socket): 23 while True: 24 # 接收消息,类型为元祖类型,(数据(ip,port)) 25 recv_data = udp_socket.recvfrom(1024) 26 # 打印数据,元祖取值,进行解码为gbk 27 print(recv_data[0].decode('gbk')) 28 29 def main(): 30 # 创建套接字 31 udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 32 local_addr = ("10.3.10.73", 7880) 33 udp_socket.bind(local_addr) 34 # 创建线程,发送函数 35 t_send =threading.Thread(target=sendmsg,args=(udp_socket,)) 36 # 创建线程,接收函数 37 t_revice=threading.Thread(target=receivemsg,args=(udp_socket,)) 38 # 启动线程 39 t_send.start() 40 t_revice.start() 41 # 关闭套接字,注意,关闭线程暂时无法使用? 42 #udp_socket.close() 43 if __name__ == '__main__': 44 main()
import threading
import time
# Learner BM
""
"""
1,线程执行过程是没有顺序的,线程执行的时候是随机的,如果需要控制线程执行的顺序,需要对线程进行延时处理,
2,如果需要查看当前线程执行数量,可以使用enumerate函数
3,线程的创建与执行,从对象的start方法开始,一个函数的调用结束时,就是线程的生命周期结束完(创建线程对象的时候,不会创建线程)
4,子线程先结束后主线程在结束,否则程序出错
"""
# 定义函数
def dance():
for i in range(5):
print('老板在跳舞')
time.sleep(1)
# 定义函数
def sing():
for i in range (10):
print('老板在唱歌')
time.sleep(1)
# 主函数
def mian():
#****调用threading模块的thread类创建对象,(类的参数为 函数变量名)
t1 = threading.Thread(target= dance)
t2 = threading.Thread(target=dance)
t1.start()
t2.start()
#
while True:
print(threading.enumerate())
if len(threading.enumerate())<=1:
break
time.sleep(1)
if __name__ == "__main__":
mian()
浙公网安备 33010602011771号