Python 中的多进程、多线程编程(关键词:Python/进程/线程/多进程/多线程)

本文深入探讨Python中的多进程和多线程编程,包括进程和线程的概念、区别,以及Python的多进程实现,如后台进程、进程池,还涉及进程间通信的队列、管道和Lock对象。同时,介绍了Python多线程的使用,如线程类和信号量。
摘要由CSDN通过智能技术生成

进程

进程是什么?

进程:执行中的程序。包括代码段、程序计数器、堆栈段(临时数据,如局部变量、函数参数和返回地址)、堆(进程运行期间动态分配的内存)、进程状态、CPU 调度信息、I/O状态信息(如打开文件列表)

进程控制块(Process Control Block)

(详见《操作系统概念(第 7 版)》 - P73)

线程

线程是什么?

线程是 CPU 使用的基本单元,由线程 ID、程序计数器、寄存器集合和栈组成。

进程与线程的区别?

线程与属于同一进程的其他线程共享代码段、公共数据段、打开文件和信号等等。

在这里插入图片描述
(《操作系统概念(第 7 版)》 - P111)

多进程与多线程的区别?

区别 1:和线程不同,进程没有任何共享状态;如果某个进程修改数据,改动只限于那个进程内。
(Python 参考手册 - P336)
区别 2:Python 中的多进程可以实现真正的并行,Python 中的多线程不能实现真正的并行。

(OS概念 - 第 7 版 - P112)
线程优点:

  1. 资源共享:线程默认共享所属进程的内存、代码、数据等资源;
  2. 经济:相比于进程,创建、切换线程的时间、资源开销较小;
  3. 响应度高。

Python 中的多线程?

由于 GIL 的存在,这个锁保证同一时刻只有 1 个线程在运行。
(《Python 核心编程(第 2 版)》 - 18.3.1 全局解释器锁 ( GIL ) - P514)
即使是多核 CPU,使用多线程编程,各个线程也只能交替使用 CPU 。
因此Python 中的多线程并不能实现真正的并行。
(Python 3 教程 - 廖雪峰 - 进程和线程 - 多线程 - 多核 CPU 。)

Python 多进程编程

后台进程

如果 1 个进程是后台进程,那么,当创建这个后台进程的进程终止,后台进程会自动终止。
(Python 参考手册 - P337)

以单个进程的形式创建、启动函数

代码清单 - 1

# p337_single_process_with_function.py
from multiprocessing import Process
from time import ctime, sleep

def clock(interval):
        while True:
                print("The time is %s" % ctime())
                sleep(interval)

if __name__ == "__main__":
        p = Process(target=clock, args=(2,))
        #p.daemon = False
        p.start()
        #print("hello!")
        #p.join()

代码清单 - 2

# p337_single_process_with_function_Daemon_False.py
from multiprocessing import Process
from time import ctime, sleep

def clock(interval):
        while True:
                print("The time is %s" % ctime())
                sleep(interval)

if __name__ == "__main__":
        p = Process(target=clock, args=(2,))
        p.daemon = False
        p.start()
        #print("hello!")
        #p.join()

以上两段代码均会永远执行。

补充一点背景知识:

  1. 主进程的 daemon 标志默认为 False,即主进程默认不是后台进程;
  2. 在主进程开启的子进程会继承主进程的 daemon 标志,于是子进程的 daemon 标志为 False,子进程默认不是后台进程;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值