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)    收藏  举报

导航