当前位置:首页 > 编程笔记 > 正文
已解决

Python 进程和线程详解(multiprocessing、threading)

来自网友在路上 11038103提问 提问时间:2023-11-21 19:45:39阅读次数: 103

最佳答案 问答题库1038位专家为你答疑解惑

文章目录

  • 1 概述
    • 1.1 进程 VS 线程
    • 1.2 优缺点
  • 2 进程
    • 2.1 三个步骤
    • 2.2 多进程
    • 2.3 带参数
      • 2.3.1 元组参数 args
      • 2.3.2 字典参数 kwargs
    • 2.4 获取进程编号
    • 2.5 设置进程守护
  • 3 线程
    • 3.1 三个步骤
    • 3.2 多线程
    • 3.3 带参数
      • 2.3.1 元组参数 args
      • 2.3.2 字典参数 kwargs
    • 2.4 获取线程编号
    • 2.5 设置线程守护

1 概述

1.1 进程 VS 线程

<style>#mermaid-svg-hjnbozuL2qYkEYXY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hjnbozuL2qYkEYXY .error-icon{fill:#552222;}#mermaid-svg-hjnbozuL2qYkEYXY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hjnbozuL2qYkEYXY .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-hjnbozuL2qYkEYXY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hjnbozuL2qYkEYXY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hjnbozuL2qYkEYXY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hjnbozuL2qYkEYXY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hjnbozuL2qYkEYXY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hjnbozuL2qYkEYXY .marker.cross{stroke:#333333;}#mermaid-svg-hjnbozuL2qYkEYXY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hjnbozuL2qYkEYXY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hjnbozuL2qYkEYXY .cluster-label text{fill:#333;}#mermaid-svg-hjnbozuL2qYkEYXY .cluster-label span{color:#333;}#mermaid-svg-hjnbozuL2qYkEYXY .label text,#mermaid-svg-hjnbozuL2qYkEYXY span{fill:#333;color:#333;}#mermaid-svg-hjnbozuL2qYkEYXY .node rect,#mermaid-svg-hjnbozuL2qYkEYXY .node circle,#mermaid-svg-hjnbozuL2qYkEYXY .node ellipse,#mermaid-svg-hjnbozuL2qYkEYXY .node polygon,#mermaid-svg-hjnbozuL2qYkEYXY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hjnbozuL2qYkEYXY .node .label{text-align:center;}#mermaid-svg-hjnbozuL2qYkEYXY .node.clickable{cursor:pointer;}#mermaid-svg-hjnbozuL2qYkEYXY .arrowheadPath{fill:#333333;}#mermaid-svg-hjnbozuL2qYkEYXY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hjnbozuL2qYkEYXY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hjnbozuL2qYkEYXY .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-hjnbozuL2qYkEYXY .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-hjnbozuL2qYkEYXY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hjnbozuL2qYkEYXY .cluster text{fill:#333;}#mermaid-svg-hjnbozuL2qYkEYXY .cluster span{color:#333;}#mermaid-svg-hjnbozuL2qYkEYXY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hjnbozuL2qYkEYXY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style>
进程
线程 1
线程 2
线程 N

举例说明:
进程:QQ.exe
线程:支撑 QQ.exe 运行的各个程序

1.2 优缺点

优点缺点进程可用多核 CPU资源开销大线程资源开销小只能单核 CPU

2 进程

2.1 三个步骤

# 1.导入进程包
import  ultiprocessing# 2.通过进程类创建进程对象,参数名有
# target: 执行的目标任务名(函数名、方法名)
# name  : 进程名,一般不用设置
# group : 进程组,一般不用设置
进程对象 = ultiprocessing.Process(target=任务名)# 3.启动进程
进程对象.start()

2.2 多进程

import multiprocessing
import time# 唱歌
def sing():for i in range(3):print("唱歌...")time.sleep(1)# 跳舞
def dance():for i in range(3):print("跳舞...")time.sleep(1)if __name__ == '__main__':sing_process = multiprocessing.Process(target=sing)dance_process = multiprocessing.Process(target=dance)sing_process.start()dance_process.start()

2.3 带参数

参数描述元组 args参数有顺序要求字典 kwargs参数无顺序要求
import multiprocessing
import time# 唱歌
def sing(num):for i in range(num):print("唱歌...")time.sleep(1)# 跳舞
def dance(num):for i in range(num):print("跳舞...")time.sleep(1)if __name__ == '__main__':sing_process = multiprocessing.Process(target=sing, args=(3,))dance_process = multiprocessing.Process(target=dance, kwargs={"num": 3})sing_process.start()dance_process.start()

2.3.1 元组参数 args

sing_process = multiprocessing.Process(target=sing, args=(3,))
sing_process.start()

2.3.2 字典参数 kwargs

sing_process = multiprocessing.Process(target=dance, kwargs={"num": 3})
sing_process.start()

2.4 获取进程编号

import osprint(os.getpid())  # 当前进程ID
print(os.getppid())  # 当前进程的父ID

2.5 设置进程守护

import multiprocessing
import time# 工作
def work():for i in range(10):print("工作中...")time.sleep(0.5)if __name__ == '__main__':work_process = multiprocessing.Process(target=work)# 设置守护进程work_process.daemon = Truework_process.start()time.sleep(1)print("主进程执行已完成!")

设置守护进程的前后对比图:
在这里插入图片描述

3 线程

3.1 三个步骤

# 1.导入线程模块
import threading# 2.通过线程类创建线程对象,参数名有
# target: 执行的目标任务名(函数名、方法名)
# name  : 线程名,一般不用设置
# group : 线程组,一般不用设置
线程对象 = threading.Thread(target=任务名)# 3.启动线程执行任务
线程对象.start()

3.2 多线程

import threading
import time# 唱歌
def sing():for i in range(3):print("唱歌...")time.sleep(1)# 跳舞
def dance():for i in range(3):print("跳舞...")time.sleep(1)if __name__ == '__main__':sing_process = threading.Thread(target=sing)dance_process = threading.Thread(target=dance)sing_process.start()dance_process.start()

3.3 带参数

  • 同进程
import threading
import time# 唱歌
def sing(num):for i in range(num):print("唱歌...")time.sleep(1)# 跳舞
def dance(num):for i in range(num):print("跳舞...")time.sleep(1)if __name__ == '__main__':sing_process = threading.Thread(target=sing, args=(3,))dance_process = threading.Thread(target=dance, kwargs={"num": 3})sing_process.start()dance_process.start()

2.3.1 元组参数 args

sing_process = multiprocessing.Thread(target=sing, args=(3,))
sing_process.start()

2.3.2 字典参数 kwargs

sing_process = multiprocessing.Thread(target=dance, kwargs={"num": 3})
sing_process.start()

2.4 获取线程编号

import threadingdef work():print(f"线程ID为: {threading.current_thread().ident}")if __name__ == '__main__':work_thread = threading.Thread(target=work)work_thread.start()

2.5 设置线程守护

  • 同 进程
import threading
import time# 工作
def work():for i in range(10):print("工作中...")time.sleep(0.5)if __name__ == '__main__':work_thread = threading.Thread(target=work)# 设置守护线程work_thread.setDaemon(True)work_thread.start()time.sleep(1)print("主进程执行已完成!")
查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"Python 进程和线程详解(multiprocessing、threading)":http://eshow365.cn/6-41500-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!