一,什么是多任务

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()
View Code

二,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()
View Code

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()
View Code

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 """
View Code

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()
View Code

 

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()
posted on 2020-03-22 19:45  RRRRRRR1  阅读(4)  评论(0)    收藏  举报