并发编程之多线程

时间:2022-08-28 18:01:11

一、线程理论

1. 线程是什么

  • 每个进程有一个地址空间,而且默认有一个线程
  • 进程只是用来把资源集中到一起,而线程才是CPU上的执行单位(进程只是个资源单位)

2. 线程和进程的区别

  • 同一个进程内的多个线程共享该进程内的地址资源
  • 创建线程的开销远远要小于创建进程的开销
  • 创建一个进程,就是创建一个车间,涉及到申请空间,而且在空间内建至少一条流水线就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小)

3.多线程的举例

二、开启线程的两种方式

方式一:函数式开启线程

并发编程之多线程并发编程之多线程
 1 from threading import Thread
 2 from time import sleep
 3 
 4 
 5 def read(name):
 6     print('%s start read!' % name)
 7     sleep(3)
 8     print('%s stop read!' % name)
 9 
10 
11 if __name__ == '__main__':
12      t = Thread(target=read,args=('sjingx',))
13      t.start()
14      print('主线程')
函数式开启线程

方式二:类继承方式开启线程

并发编程之多线程并发编程之多线程
 1 from threading import Thread
 2 from time import sleep
 3 
 4 
 5 class Read(Thread):
 6     def __init__(self, name):
 7         super().__init__()
 8         self.name = name
 9 
10     def run(self):
11         print('%s start read!' % self.name)
12         sleep(3)
13         print('%s stop read!' % self.name)
14 
15 
16 if __name__ == '__main__':
17     r = Read('sjingx')
18     r.run()
19     print('主线程')
类继承方式开启线程

练习题:

1. 基于多线程实现并发的套接字通信。

2. 编写一个简单的文本处理工具,具备三个任务,一个接收用户输入,一个将用户输入的内容格式化成大写,一个将格式化后的结果存入文件。

三、多线程和多进程的区别

1.谁开启速度快

在主进程下开启线程

import time

from multiprocessing import Process
from threading import Thread


# 开启进程
class Read(Process):

    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print('%s start read' % self.name)


if __name__ == '__main__':
    t1 = time.time()
    r = Read('sjingx')
    r.start()
    print('主进程')
    t2 = time.time()
    print(t2-t1)
    
# 结果是:
# 主进程
# 0.024098873138427734
# sjingx start read 

 

在主进程下开启进程

import timefrom threading import Thread

# 开启线程
class Read(Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print('%s start read' % self.name)


if __name__ == '__main__':
    t1 = time.time()
    r = Read('sjingx')
    r.start()
    print('主线程')
    t2 = time.time()
    print(t2-t1)

# 运行结果:
# sjingx start read
# 主线程
# 0.001003265380859375

2.多线程和多进程pid的情况

3.同一进程内的线程共享该进程的数据

 

四、Thread对象的其他属性或方法

 

五、守护线程

 

六、GIL全局解释器锁

 

七、死锁现象与递归锁