多任务:同一时间执行多个任务,有并发和并行两种表现形式
并发:在一段时间内交替执行多个任务
并行:在一段时间内真正的同时执行多个任务
进程(Process)是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位;通俗理解:一个正在运行的程序就是一个进程。
这里使用的是跨平台的多进程模块multiprocessing
导入进程包
import multiprocessing
import time
def sing(num, name):
for i in range(num):
print('%s is singing....' % name)
time.sleep(1)
def dance(num):
for i in range(num):
print('dancing...')
time.sleep(1.5)
if __name__ == '__main__':
#利用multiprocessing中的 Process 类创建进程对象
sing_process = multiprocessing.Process(target=sing, args=(2,'majiko'))
dance_process = multiprocessing.Process(target=dance,kwargs={
'num':3})
#开始进程
sing_process.start()
dance_process.start()
终端输出:
majiko is singing....
dancing...
majiko is singing....
dancing...
dancing...
进程执行带参数的任务时,参数传递有两种方式:
获取当前进程的编号:os.getpid()
获取当前进程的父进程的编号:os.getppid()
import multiprocessing
import time
import os
def sing():
print('子进程sing编号:', os.getpid())
print('子进程sing的父进程编号:',os.getppid())
for i in range(3):
print('singing....')
time.sleep(1)
def dance():
print('子进程dance编号:', os.getpid())
print('子进程dance的父进程编号:',os.getppid())
for i in range(3):
print('dancing...')
time.sleep(2)
if __name__ == '__main__':
#创建进程
print('父进程编号:', os.getpid())
sing_process = multiprocessing.Process(target=sing)
dance_process = multiprocessing.Process(target=dance)
#开始进程
sing_process.start()
dance_process.start()
终端输出:
父进程编号: 13480
子进程sing编号: 8068
子进程dance编号: 14928
子进程sing的父进程编号: 13480
子进程dance的父进程编号:singing....
13480
dancing...
singing....
dancing...singing....
dancing...
正常情况下,主进程会等待所有的子进程执行结束后在退出。
守护主进程:主进程退出子进程销毁,也就是说一旦主进程退出,就不会在执行子进程中剩余的代码。
要设置守护主进程,只需在启动线程之前添加一行代码:
子进程对象.daemon = True
或者在创建进程对象时添加参数 daemon
子进程 = multiprocessing.Process(target = ' function_name', daemon = True)
import multiprocessing
import time
def work():
for i in range(5):
print('subprocess is working...')
time.sleep(1)
if __name__ == '__main__':
print('parent process start')
work_process = multiprocessing.Process(target = work)
#work_process.daemon = True #设置进程守护
work_process.start()
time.sleep(3) #主进程执行3秒, 子进程需要执行5秒
print('parent process end')
终端输出:(未设置进程守护)
parent process start
subprocess is working...
subprocess is working...
subprocess is working...
parent process end
subprocess is working...
subprocess is working...
终端输出:(设置进程守护)
parent process start
subprocess is working...
subprocess is working...
subprocess is working...
parent process end
线程的创建过程和进程类似,只是使用的模块不同而已
#导入进程包
import threading
import time
def sing(num, name):
for i in range(num):
print('%s is singing....' % name)
time.sleep(1)
def dance(num):
for i in range(num):
print('dancing...')
time.sleep(1.5)
if __name__ == '__main__':
#利用threading中的 Thread 类创建进程对象
sing_thread = threading.Thread(target=sing, args=(2,'majiko'))
dance_thread = threading.Thread(target=dance,kwargs={
'num':3})
#开始进程
sing_thread.start()
dance_thread.start()
主线程结束子线程销毁
import threading
import time
def work():
for i in range(10):
print('Working...')
time.sleep(0.5)
if __name__ == '__main__':
sub_thread = threading.Thread(target = work, daemon = True)
sub_thread.start()
time.sleep(2)
print('主线程结束')
终端输出:
Working...
Working...
Working...
Working...
主线程结束