python学习 多线程VS多进程/多线程/线程锁/创建全局ThreadLocal对象
进程VS线程
【功能】
进程,能够完成多任务,⽐如在⼀台电脑上能够同时运⾏多个QQ。
线程,能够完成多任务,⽐如⼀个QQ中的多个聊天窗⼝。
【定义的不同】
进程是系统进⾏资源分配和调度的⼀个独⽴单位。
线程是进程的⼀个实体,是CPU调度和分派的基本单位,它是⽐进程更⼩的能独⽴运⾏的基本单位。线程⾃⼰基本上不拥有系统资源,只拥有⼀点在运⾏中必不可少的资源(如程序计数器,⼀组寄存器和栈),但是它可与同属⼀个进程的其他的线程共享进程所拥有的全部资源.
【区别】
⼀个程序⾄少有⼀个进程,⼀个进程⾄少有⼀个线程。
线程的划分尺度⼩于进程(资源⽐进程少),使得多线程程序的并发性⾼。
进程在执⾏过程中拥有独⽴的内存单元,⽽多个线程共享内存,从⽽极⼤地提⾼了程序的运⾏效率。
线程不能够独⽴执⾏,必须依存在进程中。
【优缺点】
线程和进程在使⽤上各有优缺点:线程执⾏开销⼩,但不利于资源的管理和 保护;⽽进程正相反。
1 #多线程 2 from threading import Thread 3 from time import sleep 4 5 def work(): 6 print('hhh') 7 sleep(1) 8 9 for i in range(5): 10 a=Thread(target=work) 11 a.start() 12 13 14 #Thread子类创建子进程 15 class myThread(Thread): 16 def run(self): 17 for i in range(3): 18 print(i,'hhhh') 19 sleep(1) 20 21 if __name__ == '__main__': 22 a = myThread() 23 a.start() 24 25 26 #多线程之间可共用全局变量 27 num=100 28 def work1(): 29 global num 30 for i in range(3): 31 num+=1 32 print(num) 33 34 def work2(): 35 global num 36 print(num) 37 38 a=Thread(target=work1) 39 b=Thread(target=work2) 40 a.start() 41 sleep(1) #等待1秒再执行b.start() 42 b.start() 43 #打印结果 103 44 45 46 #列表当做实参传递到线程中 47 def work1(nums): 48 nums.append(44) 49 print(nums) 50 51 def work2(nums): 52 sleep(1) 53 print(nums) 54 55 nums=[11,22,33] 56 57 t1=Thread(target=work1,args=(nums,)) 58 t2=Thread(target=work2,args=(nums,)) 59 t1.start() 60 t2.start() 61 62 63 #多线程-使用互斥锁避免全局变量被修改 64 num=0 65 import threading 66 lock=threading.Lock() #创建锁 67 68 def work1(): 69 global num 70 lock.acquire() #锁定 71 for i in range(1000000): 72 num+=1 73 lock.release() #释放 74 print(num) 75 76 def work2(): 77 global num 78 lock.acquire() 79 for i in range(1000000): 80 num+=1 81 lock.release() 82 print(num) 83 84 a=Thread(target=work1) 85 b=Thread(target=work2) 86 a.start() 87 b.start() 88 89 90 #多线程-非全局变量,即函数里面的变量,不是共享的,不需要加锁 91 import threading 92 def work1(): 93 num=100 94 name=threading.current_thread().name 95 if name=='Thread-1': 96 num+=1 97 else: 98 sleep(2) 99 print('name-{},num-{}'.format(name,num)) 100 101 a1=Thread(target=work1) 102 a2=Thread(target=work1) 103 a1.start() 104 a2.start() 105 106 #打印结果: 107 # name-Thread-1,num-101 108 # name-Thread-2,num-100
1 '''创建全局ThreadLocal对象--解决了各线程之间使用全局变量造成混乱的问题,即各线程之间可以使用全局变量不受干扰''' 2 import threading 3 4 # 创建全局ThreadLocal对象 5 local_school=threading.local() 6 7 def process_thread(name): 8 #绑定ThreadLocal的student 9 local_school.student=name 10 process_student() 11 12 def process_student(): 13 #获取当前线程关联的student 14 stu=local_school.student 15 print('hello,{} in {}'.format(stu,threading.current_thread().name)) 16 17 t1=threading.Thread(target=process_thread,args=('alex',)) 18 t2=threading.Thread(target=process_thread,args=('joe',)) 19 t1.start() 20 t2.start() 21 t1.join() 22 t2.join()

posted on 2019-08-20 20:52 cherry_ning 阅读(161) 评论(0) 收藏 举报
浙公网安备 33010602011771号