python多进程和多线程(学习笔记)

多任务:同一时间执行多个任务,有并发并行两种表现形式

并发:在一段时间内交替执行多个任务

并行:在一段时间内真正的同时执行多个任务

多进程

进程(Process)是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位;通俗理解:一个正在运行的程序就是一个进程。

多进程的作用,如下图:
python多进程和多线程(学习笔记)_第1张图片

多进程的创建

这里使用的是跨平台的多进程模块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...

进程执行带参数的任务时,参数传递有两种方式:

  • 元组方式传参实参传入的顺序要与函数中形参顺序一致
  • 字典方式传参:字典中的key要与函数中形参名保持一致

获取进程编号

获取当前进程的编号: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

多线程

python多进程和多线程(学习笔记)_第2张图片
多线程的作用,如下图:
python多进程和多线程(学习笔记)_第3张图片

多线程的创建

线程的创建过程和进程类似,只是使用的模块不同而已

#导入进程包
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...
主线程结束

进程与线程的对比

python多进程和多线程(学习笔记)_第4张图片

你可能感兴趣的:(Python基础学习笔记,多线程,python,多进程)