多任务的执行:
并发:在一段时间内交替执行
并行:同时执行,真正意义上的同时
在python里实现多任务 使用进程来实现,进程是实现多任务的一种方式
进程:一个正在执行的软件或程序,是os进行资源分配和调度运行的基本单位。指分配资源,不会真的执行,真正执行的是线程
线程:每个进程下一定有一个主线程,来执行代码
一个进程就好像一个公司,不同公司提供不同的资源,干活的是员工,也就是线程文章源自爱尚资源教程网-https://www.23jcw.net/6351.html
import multiprocessing import time
def dance():
for i in range(5):
print('dancing')
time.sleep(0.2)
def sing():
for i in range(5):
print('singing')
time.sleep(0.2)
if __name__=='__main__':
# 创建子进程对象 target:指定执行目标任务 name:进程名,不设置就是Process-1,group:进程组,目前不需要
dance_process = multiprocessing.Process(target = dance)
sing_process = multiprocessing.Process(target = sing)
# 启动
dance_process.start()
sing_process.start()
进程执行带有参数的任务文章源自爱尚资源教程网-https://www.23jcw.net/6351.html
args:以元组方式进行传参,只有一个的时候需要多加一个’,'不然会被说int不可以循环文章源自爱尚资源教程网-https://www.23jcw.net/6351.html
kwargs:以字典方式进行传参文章源自爱尚资源教程网-https://www.23jcw.net/6351.html
import multiprocessing
import time
def dance(num):
for i in range(num):
print('dancing')
time.sleep(0.2)
def sing(num):
for i in range(num):
print('singing')
time.sleep(0.2)
if __name__=='__main__':
# 创建子进程对象 target:指定执行目标任务 name:进程名,不设置就是Process-1,group:进程组,目前不需要
dance_process = multiprocessing.Process(target=dance, args=(3,))
sing_process = multiprocessing.Process(target=sing, kwargs={'num': 5})
# 启动
dance_process.start()
sing_process.start()
获取进程编号
os.getpid() 获取当前进程编号
os.getppid() 获取当前进程的父进程编号文章源自爱尚资源教程网-https://www.23jcw.net/6351.html
import multiprocessing
import time
import os
def dance(num):
print("dance's father >>>%d" % os.getppid())
for i in range(num):
print('dancing')
time.sleep(0.2)
def sing(num):
print("sing's father >>>%d" % os.getppid())
for i in range(num):
print('singing')
time.sleep(0.2)
if __name__=='__main__':
# 创建子进程对象 target:指定执行目标任务 name:进程名,不设置就是Process-1,group:进程组,目前不需要
print("main>>>%d" % os.getpid())
dance_process = multiprocessing.Process(target=dance, args=(2,))
sing_process = multiprocessing.Process(target=sing, kwargs={'num': 2})
# 启动
dance_process.start()
sing_process.start()
进程之间不共享全局变量
创建子进程是把主进程的资源进行拷贝,产生了一个新的进程,所以主进程、子进程相互独立,互不打扰文章源自爱尚资源教程网-https://www.23jcw.net/6351.html
import multiprocessing
import time
# 定义全局变量
my_list = []
def write_data():
for i in range(5):
my_list.append(i)
print("add:", i)
print('write:', my_list)
def read_data():
print('read:', my_list)
if __name__ == '__main__':
# 创建写进程
write_process = multiprocessing.Process(target=write_data)
# 创建读进程
read_process = multiprocessing.Process(target=read_data)
write_process.start()
time.sleep(1)
read_process.start()
主进程和子进程的结束顺序
主进程:微信
子进程:一些聊天窗口
当直接结束主进程的时候,首先结束子进程,再结束主进程
以下是代码执行结果,即使打印了主进程结束,但还是没结束,主进程在等待子进程执行文章源自爱尚资源教程网-https://www.23jcw.net/6351.html
import multiprocessing
import time
def work():
for i in range(10):
print('working...')
time.sleep(0.2)
if __name__ == '__main__':
work_process = multiprocessing.Process(target=work)
work_process.start()
time.sleep(1)
print('main process is over')
设置守护主进程/手动销毁子进程
当把一个子进程设置为守护主进程,那么主进程不等子进程。当执行完以后,直接销毁子进程,不在执行子进程文章源自爱尚资源教程网-https://www.23jcw.net/6351.html
def work():
for i in range(10):
print('working...')
time.sleep(0.2)
if __name__ == '__main__':
work_process = multiprocessing.Process(target=work)
# 设置为 守护主进程
work_process.daemon = True
work_process.start()
time.sleep(1)
print('main process is over')
import multiprocessing
import time
def work():
for i in range(10):
print('working...')
time.sleep(0.2)
if __name__ == '__main__':
work_process = multiprocessing.Process(target=work)
# 设置为 守护主进程
# work_process.daemon = True
work_process.start()
time.sleep(1)
# 手动销毁
work_process.terminate()
print('main process is over')
文章源自爱尚资源教程网-https://www.23jcw.net/6351.html 文章源自爱尚资源教程网-https://www.23jcw.net/6351.html
