概述
进程是资源分配的最小单位,一个程序至少有一个进程。
线程是程序执行的最小单位,一个进程至少有一个线程。
一个进程中可以存在多个线程,在单核CPU中每个进程中同时刻只能运行一个线程,只有在多核CPU中才能存在线程并发的情况。
Python的多线程,只有用于I/O密集型程序时效率才会有明显的提高。
一、多进程
#多进程学习
#1.导入多进程包
import multiprocessing
import time
def sing():
for i in range(3):
print("sing")
time.sleep(0.5)
def dance():
for i in range(3):
print("dance")
time.sleep(0.5)
if __name__ == '__main__':
#2.使用进程类创建进程对象
sing_process = multiprocessing.Process(target=sing)
dance_process = multiprocessing.Process(target=dance)
#3.启动进程
sing_process.start()
dance_process.start()
#发现同时执行,不是单线程顺序执行
进程传参
#进程执行带参任务
#target:任务名
#args:元组方式传参args=(参数 ,) 、kwargs:字典方式传参 kwargs= {“参数名”:参数}
#元组顺序需要一致
sing_process = multiprocessing.Process(target=sing,args=(3,"xiaom"))
dance_process = multiprocessing.Process(target=dance,kwargs={"num":3})
获取进程编号
目的:获取进程编号便于管理
import os
#获取当前进程编号
os.getpid()
#获取当前父进程编号
os.getppid()
图1-1 终端输出结果
进程守护
#2.使用进程类创建进程对象
sing_process = multiprocessing.Process(target=sing)
dance_process = multiprocessing.Process(target=dance)
#主进程结束,子进程立刻结束。否则不结束(守护主进程)
#设置守护
sing_process.daemon = True
防止主进程结束子进程仍未结束
二、多线程
类似 于多进程
#多线程学习
#1.导入线程模块
import threading
#target:任务名
#args:元组方式传参args=(参数 ,) 、kwargs:字典方式传参 kwargs= {“参数名”:参数}
#元组顺序需要一致
import time
def sing():
for i in range(3):
print("sing")
time.sleep(0.5)
def dance():
for i in range(3):
print("dance")
time.sleep(0.5)
if __name__ == '__main__':
#2.创建线程对象
sing_thread = threading.Thread(target = sing,daemon=True)#创建时设置守护
dance_thread = threading.Thread(target = dance)
dance_thread.daemon = True #创建完设置守护
#3.启动线程
sing_thread.start()
dance_thread.start()
获取线程信息(threading模块中的一些函数)
activeCount() :获取当前活动中的Thread对象个数
currentThread() :获取当前的Thread对象
enumerate() :获取当前活动的Thread对象列表
join与主线程守护daemon
t1.join()#等待子线程结束运行,否则一直挂起
t1.daemon = True #创建完设置守护,必须在start()调用之前设置,如果不设置为守护线程程序会被无限挂起
thread类继承创建
#thread继承类方式创建
import threading
class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
print("1")
t1 = MyThread()
if __name__ == '__main__':
t1.start()
thread类重定义
#thread继承类方式创建
import threading
class MyThread(threading.Thread):
def __init__(self,num):
threading.Thread.__init__(self)
self.num = num
def run(self):
print(self.num)
t1 = MyThread(1)
t2 = MyThread(2)
if __name__ == '__main__':
t1.start()
t2.start()