多任务的执行:
并发:在一段时间内交替执行
并行:同时执行,真正意义上的同时
在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