一、进程与线程基本概念
- 计算机的核心是CPU,他承担了所有的计算任务,就像是一座工厂,时刻在运行。
- 假设工厂的电力有限,一次只能给一个车间供电,也就是说,一个车间开工的时候,其他车间都必须停工,背后的含义就是,单个CPU一次只能运行一个任务。
- 进程就好比工厂中的车间,代表CPU能处理的单个任务,任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
- 一个车间里,可以有很多工人,他们协同完成一个任务,这些工人就是线程,一个进程包含多个线程。
- 车间里的空间是工人共享的,也就是说一个进程的内存空间被自己的多个线程共享。
- 但是一个车间的资源有限,某些资源只能工一个人使用,比如一个厕所,这代表一个线程使用某些共享内存时,其他线程必须等他结束,才能使用这块区域。
- 一个防止别人打扰你上厕所的方法就是给门上加个锁,后面的人看到锁就在外面等待。这就叫做互斥锁,防止多个线程共同读写某个内存区域。
OS的基本概念。不是这里的重点哈
二、进程与线程的基本实现
1:基本的单线程程序
import time
#工作内容
def work(n):
print(f"给{n}打销售电话") #f实现字符串拼接
time.sleep(3)
print(f"销售电话结束:{n}")
return
userList = {"yfZhang", "sss", 'xxx'}
#启动了一个进程,进程中有一个主线程
for item in userList:
work(item)
2:简单的多进程程序
引包from multiprocessing import Process
from multiprocessing import Process
import time
#工作内容
def work(n):
print(f"给{n}打销售电话") #f实现字符串拼接
time.sleep(3)
print(f"销售电话结束:{n}")
return
userList = {"yfZhang", "sss", 'xxx'}
#多进程,类似于创建多个部门来完成这个工作
if __name__ == '__main__':
#多进程方式
pList = []
for item in userList:
#循环创建进程
#第一个元素是要做的工作,第二个参数参数要求是一个元组
p = Process(target = work, args = (item,))
#生成进程
p.start()
#把创建的进程加入到列表中
pList.append(p)
# 阻塞终止进程的执行
[i.join() for i in pList]
注意多进程需要在main函数中运行,不然会报错RuntimeError: An attempt has been made to start a new process
。
3:基本的多线程程序
引包from threading import Thread
from threading import Thread
import time
#工作内容
def work(n):
print(f"给{n}打销售电话") #f实现字符串拼接
time.sleep(3)
print(f"销售电话结束:{n}")
return
userList = {"yfZhang", "sss", 'xxx'}
#多线程,类似于给部门增加人手
if __name__ == '__main__':
#多进程方式
pList = []
for item in userList:
#循环创建进程
#第一个元素是要做的工作,第二个参数参数要求是一个元组
p = Thread(target = work, args = (item,))
#生成线程
p.start()
#把创建的线程加入到列表中
pList.append(p)
# 阻塞终止线程的执行
[i.join() for i in pList]
4:进程池与线程池
所谓线程池和进程池,其实就是在工作时固定线程或者进程的数目,防止因为工作很而创建大量的进程和线程。我们分派任务的时候,当某个进程结束后,它会自动的接手目前还没有匹配线程/进程的任务继续执行。
from concurrent.futures import ThreadPoolExecutor
import time
#工作内容
def work(n):
print(f"给{n}打销售电话") #f实现字符串拼接
time.sleep(3)
print(f"销售电话结束:{n}")
return
userList = {"yfZhang", "syLi", 'xmL', 'python'}
# 1:创建线程池 确定最大的线程数目
pool = ThreadPoolExecutor(max_workers = 3)
# 2:循环指派任务和参数
[ pool.submit(work,user) for user in userList]
# 3:关闭线程池
pool.shutdown()