multiprocessing库:Python像线程一样管理进程(一)

简介: multiprocessing库:Python像线程一样管理进程(一)

前言


multiprocessing库是基于threading API,它可以把工作划分为多个进程。有些情况下,multiprocessing可以作为临时替换取代threading来利用多个CPU内核,相应地避免Python全局解释器锁所带来的计算瓶颈。


下面,我们来看看multiprocessing库创建进程与threading库有多像。


创建一个进程


要创建一个进程,最简单的方式是用一个目标函数实例化一个Process对象,然后与threading一样调用start()函数让它工作。示例如下:

import multiprocessing
def worker():
    for i in range(3):
        print(i)
if __name__=="__main__":
    p = multiprocessing.Process(target=worker)
    p.start()


运行之后,效果如下:


需要注意的是,multiprocessing库在Windows创建进程必须在if __name__=="__main__":中,这是 Windows 上多进程的实现问题。在 Windows 上,子进程会自动 import 启动它的这个文件,而在 import 的时候是会执行这些语句的。如果直接创建就会无限递归创建子进程报错。所以必须把创建子进程的部分用那个 if 判断保护起来,import 的时候 __name__ 不是 __main__ ,就不会递归运行了。


设置进程名


在threading线程中,我们可以通过其参数name设置线程名,同样的我们也可以通过name参数设置其进程的名字。示例如下:

import multiprocessing
import time
def worker():
    print(multiprocessing.current_process().name, "start")
    time.sleep(2)
    print(multiprocessing.current_process().name, "end")
if __name__ == "__main__":
    p1 = multiprocessing.Process(name='p1', target=worker)
    p2 = multiprocessing.Process(name='p2', target=worker)
    p3 = multiprocessing.Process(name='p3', target=worker)
    p1.start()
    p2.start()
    p3.start()


运行之后,效果如下:


守护进程


和线程一样,在所有子进程没有退出之前,主程序是不会退出的。有时候,我们可能需要启动一个后台进程,它可以一直运行而不阻塞主程序退出。


要标志一个守护进程,可以将其添加第3个参数daemon,设置为True。默认值为False,不作为守护进程。示例如下:

import multiprocessing
import time
def worker():
    print(multiprocessing.current_process().name, "start")
    time.sleep(1)
    print(multiprocessing.current_process().name, "end")
def worker2():
    print(multiprocessing.current_process().name, "start")
    time.sleep(2)
    print(multiprocessing.current_process().name, "end")
if __name__ == "__main__":
    p1 = multiprocessing.Process(name='p1', target=worker)
    p2 = multiprocessing.Process(name='p2', target=worker2, daemon=True)
    p3 = multiprocessing.Process(name='p3', target=worker2, daemon=True)
    p1.start()
    p2.start()
    p3.start()


运行之后,效果如下:


p2,p3为守护进程,但p1不是所以执行1秒之后,就退出主程序了,也就没有打印p2p3的内容。但是其依旧在执行中,直到执行完成。

相关文章
|
1天前
|
API 调度 开发者
Python中的并发编程:使用asyncio库实现异步IO
传统的Python编程模式中,使用多线程或多进程实现并发操作可能存在性能瓶颈和复杂性问题。而随着Python 3.5引入的asyncio库,开发者可以利用异步IO来更高效地处理并发任务。本文将介绍如何利用asyncio库实现异步IO,提升Python程序的并发性能。
|
2天前
|
JSON Shell 数据格式
第十章 Python常用标准库使用(必会)
第十章 Python常用标准库使用(必会)
|
2天前
|
开发框架 前端开发 数据库
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
|
2天前
|
数据采集 数据可视化 数据处理
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
|
2天前
|
Java 数据库连接 数据处理
Python从入门到精通:3.1.2多线程与多进程编程
Python从入门到精通:3.1.2多线程与多进程编程
|
2天前
|
JSON 测试技术 API
Python的Api自动化测试使用HTTP客户端库发送请求
【4月更文挑战第18天】在Python中进行HTTP请求和API自动化测试有多个库可选:1) `requests`是最流行的选择,支持多种请求方法和内置JSON解析;2) `http.client`是标准库的一部分,适合需要低级别控制的用户;3) `urllib`提供URL操作,适用于复杂请求;4) `httpx`拥有类似`requests`的API,提供现代特性和异步支持。根据具体需求选择,如多数情况`requests`已足够。
9 3
|
1月前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
67 0
|
3天前
|
NoSQL Linux 程序员
【linux进程信号(一)】信号的概念以及产生信号的方式
【linux进程信号(一)】信号的概念以及产生信号的方式
|
3天前
|
Java Shell Linux
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?
|
3天前
|
算法 Linux Shell
【linux进程(二)】如何创建子进程?--fork函数深度剖析
【linux进程(二)】如何创建子进程?--fork函数深度剖析