简单分享下Python进程

news2024/12/23 19:08:06

1. 单进程与多进程

理论讲解

  • 进程是操作系统中资源分配的基本单位,每个进程都有独立的内存空间。

  • 多进程允许同时运行多个进程,提高CPU利用率和程序响应速度。

示例代码

import os
print("当前进程ID:", os.getpid())

2. 使用multiprocessing模块创建子进程

理论讲解

  • multiprocessing模块提供了创建和管理子进程的方法。

示例代码

from multiprocessing import Process
import time

def worker():
    print("Worker 进程ID:", os.getpid())
    time.sleep(1)

if __name__ == "__main__":
    p = Process(target=worker)
    p.start()
    p.join()  # 等待子进程结束

3. 进程池管理

理论讲解

  • 进程池可以控制并发执行的进程数量,提高效率和资源利用。

示例代码

from multiprocessing import Pool

def square(x):
    return x * x

if __name__ == "__main__":
    with Pool(4) as p:
        result = p.map(square, range(10))
        print(result)

4. 进程间通信:队列

理论讲解

  • 队列是进程间通信的安全方式,可以实现数据的无锁交换。

示例代码

from multiprocessing import Queue, Process

def writer(q):
    q.put('Hello')

def reader(q):
    print(q.get())

if __name__ == "__main__":
    q = Queue()
    pw = Process(target=writer, args=(q,))
    pr = Process(target=reader, args=(q,))
    pw.start()
    pr.start()
    pw.join()
    pr.join()

5. 锁与同步

理论讲解

  • 在多进程中共享资源时,使用锁可以避免竞争条件。

示例代码

from multiprocessing import Lock, Process

lock = Lock()

def increment(counter):
    lock.acquire()
    try:
        counter += 1
    finally:
        lock.release()

if __name__ == "__main__":
    counter = 0
    processes = [Process(target=increment, args=(counter,)) for _ in range(10)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()
    print("Final counter:", counter)

6. 管道通信

理论讲解

  • 管道提供了一种双向通信机制,适合简单的数据传递。

示例代码

from multiprocessing import Pipe, Process

def send(pipe):
    pipe.send('Hello')
    pipe.close()

if __name__ == "__main__":
    parent_conn, child_conn = Pipe()
    p = Process(target=send, args=(child_conn,))
    p.start()
    print(parent_conn.recv())   # prints "Hello"
    p.join()

7. 使用subprocess模块

理论讲解

  • subprocess模块用于创建新进程,执行系统命令或程序。

示例代码

import subprocess

proc = subprocess.Popen(['echo', 'Hello from the child!'], stdout=subprocess.PIPE)
out, err = proc.communicate()
print(out.decode('utf-8'))

8. 进程监控与管理

理论讲解

  • 利用psutil库可以获取和管理进程信息。

示例代码

import psutil

# 打印所有运行中的进程
for proc in psutil.process_iter(['pid', 'name']):
    print(proc.info)

9. 进程优先级调整

理论讲解

  • 可以调整进程的优先级,影响其CPU使用率。

示例代码

import os

os.nice(10)  # 设置进程优先级为10(较低)

10. 异常处理与日志记录

理论讲解

  • 在多进程环境中,异常处理和日志记录对于调试和维护至关重要。

示例代码

import logging
from multiprocessing import Process

logging.basicConfig(level=logging.INFO)

def worker():
    try:
        raise Exception('Something went wrong!')
    except Exception as e:
        logging.error(f"Error in worker: {e}")

if __name__ == "__main__":
    p = Process(target=worker)
    p.start()
    p.join()

以上策略涵盖了从基础的进程创建到高级的进程管理和异常处理,可以帮助你更好地理解和掌握Python中的进程管理技术。


11. 并发模型的选择:进程 vs. 线程 vs. 协程

理论讲解

  • 进程:适用于CPU密集型任务,因为它们可以在不同的CPU核心上并行运行。

  • 线程:适用于I/O密集型任务,在单个进程内共享资源,但受GIL限制。

  • 协程:轻量级的并发模型,适用于高度I/O密集型和高并发场景,如网络请求处理。

示例代码

import asyncio

async def my_coroutine():
    print("Starting coroutine")
    await asyncio.sleep(1)
    print("Coroutine finished")

async def main():
    await asyncio.gather(my_coroutine(), my_coroutine())

if __name__ == "__main__":
    asyncio.run(main())

12. 利用concurrent.futures简化多进程编程

理论讲解

  • concurrent.futures模块提供了一个高级接口,简化了异步执行函数的调用。

示例代码

from concurrent.futures import ProcessPoolExecutor

def square(x):
    return x * x

if __name__ == "__main__":
    with ProcessPoolExecutor(max_workers=4) as executor:
        results = list(executor.map(square, range(10)))
        print(results)

13. 进程死锁的预防与解决

理论讲解

  • 死锁发生在两个或更多进程互相等待对方释放资源而无法继续执行的情况。

  • 预防措施包括使用锁的超时、资源分级和死锁检测算法。

示例代码

from multiprocessing import Lock

lock1 = Lock()
lock2 = Lock()

def process1():
    while True:
        if lock1.acquire(timeout=1):
            try:
                if lock2.acquire(timeout=1):
                    try:
                        print("Process 1 executing")
                    finally:
                        lock2.release()
            finally:
                lock1.release()

def process2():
    while True:
        if lock2.acquire(timeout=1):
            try:
                if lock1.acquire(timeout=1):
                    try:
                        print("Process 2 executing")
                    finally:
                        lock1.release()
            finally:
                lock2.release()

if __name__ == "__main__":
    p1 = Process(target=process1)
    p2 = Process(target=process2)
    p1.start()
    p2.start()
    p1.join()
    p2.join()

14. 资源管理与上下文管理器

理论讲解

  • 上下文管理器(如with语句)可以自动管理资源的生命周期,避免资源泄露。

示例代码

from multiprocessing import Pool

def worker(num):
    print(f"Worker {num} started")

if __name__ == "__main__":
    with Pool(processes=4) as pool:
        pool.map(worker, range(4))

15. 进程安全的数据结构

理论讲解

  • 在多进程环境中,使用进程安全的数据结构可以避免数据竞争和不一致问题。

示例代码

from multiprocessing import Manager

def add_to_list(shared_list):
    shared_list.append(1)

if __name__ == "__main__":
    manager = Manager()
    shared_list = manager.list()
    
    processes = []
    for _ in range(10):
        p = Process(target=add_to_list, args=(shared_list,))
        p.start()
        processes.append(p)
        
    for p in processes:
        p.join()
        
    print(shared_list)

以上分享由浅及深的,介绍了Python进程管理的各个方面,从并发模型的选择到具体的实现细节,如死锁预防、资源管理和进程安全的数据结构。通过这些实战策略的应用,我们将能够更加熟练地使用Python进行高效的多进程编程,从而提升应用程序的性能和稳定性。

16.创作不易,还望哥哥姐姐们支持支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1990932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【适配器模式】设计模式: 穿越接口的时空隧道(架起接口间的桥梁)

文章目录 Java 设计模式之适配器模式:理论与实践1. 引言1.1 结构型模式介绍1.2 为什么需要适配器模式? 2. 适配器模式概述2.1 定义2.2 关键概念2.3 适配器模式的类型 3. 适配器模式的参与者4. 适配器模式的工作原理4.1 类适配器模式的工作流程4.2 对象适…

CSS基础 - CSS3

目录 A. 简介 B. 基础用法 C. 总结 A. 简介 CSS3 是 CSS(层叠样式表)技术的升级版本。 一、新特性概述 选择器增强 CSS3 引入了更多强大的选择器,使得开发者能够更精确地选择和样式化网页元素。例如,属性选择器可以根据元素…

Golang | Leetcode Golang题解之第329题矩阵中的最长递增路径

题目: 题解: var (dirs [][]int{[]int{-1, 0}, []int{1, 0}, []int{0, -1}, []int{0, 1}}rows, columns int )func longestIncreasingPath(matrix [][]int) int {if len(matrix) 0 || len(matrix[0]) 0 {return 0}rows, columns len(matrix), len(m…

仓颉编程入门 -- 循环语句详解

仓颉编程入门 – 循环语句 一 . while 表达式 while 表达式的基本形式为: while (条件) {循环体 }注意事项 : 其中“条件”是布尔类型表达式,“循环体”是一个代码块。while 表达式将按如下规则执行: 计算“条件”表达式,如果…

计算机毕业设计选题推荐-电缆行业生产管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

LabVIEW软件开发的未来是什么?

LabVIEW软件开发的未来展望可以从以下几个方面进行分析: 1. 与硬件集成的进一步增强 LabVIEW一贯以其与硬件的紧密集成而著称,未来这一优势将进一步得到强化。随着物联网(IoT)设备、工业4.0和智能制造的发展,LabVIEW将…

Mipi SoundWire Spec 详解4.2~4.3

目录 4.2 低层特性 4.2.1 物理接口 4.2.1.1 信号拓扑 4.2.1.2 多数据通道 4.2.1.3 高性能PHY 4.2.2 数据编码 4.2.3 物理信号值和逻辑信号值的术语 4.2.4 对开发和测试低级功能的支持 4.3 控制特性 4.3.1 比特流与帧结构 4.3.1.1 控制字与带宽权衡 4.3.2 同步 4.3.…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 8月8日,星期四

每天一分钟,知晓天下事! 2024年8月8日 星期四 农历七月初五 1、 财政部预拨4.65亿元资金支持辽宁、吉林等7省(市)开展应急抢险救灾工作。 2、 2024年“三区”人才支持计划发布:全国将选派15952名教师赴“三区”。 3…

什么是三维坐标系?

在研究向量和高级微积分主题时,了解 3D 坐标系非常重要。过去,我们一直在处理平面和矩形坐标。这一次,我们将研究三维坐标系的组成部分和约定。 3D 坐标系使我们能够表示包含三个相互垂直轴的空间中的一个量。通过 3D 坐标系统,我…

计算机网络——网络层(多协议标签交换MPLS、软件定义网络SDN)

多协议标签交换MPLS 多协议标签交换MPLS(multiProtocal Label Switching):“多协议”表示在MPLS的上层可以采用多种协议。 MPLS利用面向连接技术,使每个分组携带一个叫作标签的小整数(这叫作打上标签)。当分…

Linux下终极下载管理器:uGet and aria2

你是否曾在火狐浏览器中点击过下载链接,然后连接中断,不得不从头开始重新下载文件? 这就是 uGet 下载管理器的用武之地。 1)uGet 是一款开源的轻量级下载管理器,适用于 Linux、BSD、Android 和 Windows。有了 uGet&a…

Github 2024-08-08 开源项目日报Top10

根据Github Trendings的统计,今日(2024-08-08统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目5JavaScript项目3Python项目2C#项目1C++项目1Go项目1免费编程学习平台:freeCodeCamp.org 创建周期:3302 天开发语言:TypeScri…

Linux-入门-02

上节我们讲了如何安装虚拟机,本节课讲一些linux的常用命令,首先我们需要做一些配置,我们的centos的镜像是最小版安装,里面什么也没有,所以我们的linux是不能进行联网的,接下来我们就来一步一步联网 1、配置网络 首先我们需要先使用命令查看ip地址,linux中一切皆文件,只能使用命…

opencascade TopoDS_TShape源码学习

opencascade TopoDS_TShape 前言 TShape 是描述二维或三维空间中一组点的拓扑结构。 拓扑形状是由其他形状组成的结构。这是一个延迟类,用于支持拓扑对象。 TShape 由其可选的域(几何)和组件(带有位置和方向的其他 TShape&#…

德国EKKIF高定五金——不断探索全球新材料、新技术和新生活方式

Ekkif Concept品牌理念 “New life” We have always advocated the new concept and lifestyle of "New life". Our design team adheres to the concept of innovation and originality, constantly exploring new materials, technologies, and lifestyles a…

详细分析Linux中的ss命令基本知识(附Demo)

目录 1. 基本知识2. 基本命令2.1 查套接字2.2 查端口 1. 基本知识 ss 用于在 Linux 系统中显示网络套接字统计信息的命令 是 netstat 命令的现代替代品,提供了更快、更详细的输出是 iproute2 套件的一部分,支持许多高级网络功能 基本的功能如下&#…

html+css 实现hover选择按钮

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目…

WEB应用(十四)---文件上传

什么是文件上传漏洞 文件上传是Web应用的常见功能,允许用户上传图片、视频及其他文件类型文件。如果用户上传的是木马文件,则服务器就会收到攻击。 对于这个漏洞的练习有一个专门的靶场,即upload-labs,这个的安装可以在windows中使…

使用TLA+形式化验证Go并发程序

Writing is natures way of letting you know how sloppy your thinking is - Guindon 在2024年6月份举办的GopherCon Europe Berlin 2024[1]上,一个叫Raghav Roy的印度程序员(听口音判断的)分享了Using Formal Reasoning to Build Concurrent Go Systems[2]&#x…

JavaScript基础 - 基础

目录 A. 简介 B. 基础用法 一. 使用 二. 输出 C. 语法 D. HTML DOM A. 简介 JavaScript 是一种高级的、解释型的编程语言,主要用于网页开发,以下是它的简介: 一、历史与发展 诞生 JavaScript 于 1995 年由 Netscape 公司的 Brendan …