PYTHON基础技能 – Python进程管理的15大实战策略

释放双眼,带上耳机,听听看~!

1. 理解进程与多进程

理论讲解

  • 进程是操作系统中资源分配的基本单位,每个进程都有独立的内存空间。
  • 多进程允许同时运行多个进程,提高CPU利用率和程序响应速度。

示例代码


1
import&nbsp;os<br>print("当前进程ID:",&nbsp;os.getpid())

2. 使用
1
multiprocessing

模块创建子进程

理论讲解

  • 1
    multiprocessing

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

示例代码


1
from&nbsp;multiprocessing&nbsp;import&nbsp;Process<br>import&nbsp;time<br><br>def&nbsp;worker():<br>&nbsp;&nbsp;&nbsp;&nbsp;print("Worker&nbsp;进程ID:",&nbsp;os.getpid())<br>&nbsp;&nbsp;&nbsp;&nbsp;time.sleep(1)<br><br>if&nbsp;__name__&nbsp;==&nbsp;"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;Process(target=worker)<br>&nbsp;&nbsp;&nbsp;&nbsp;p.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;p.join()&nbsp;&nbsp;<em>#&nbsp;等待子进程结束</em>

3. 进程池管理

理论讲解

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

示例代码


1
from&nbsp;multiprocessing&nbsp;import&nbsp;Pool<br><br>def&nbsp;square(x):<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;x&nbsp;*&nbsp;x<br><br>if&nbsp;__name__&nbsp;==&nbsp;"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;Pool(4)&nbsp;as&nbsp;p:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;p.map(square,&nbsp;range(10))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(result)

4. 进程间通信:队列

理论讲解

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

示例代码


1
from&nbsp;multiprocessing&nbsp;import&nbsp;Queue,&nbsp;Process<br><br>def&nbsp;writer(q):<br>&nbsp;&nbsp;&nbsp;&nbsp;q.put('Hello')<br><br>def&nbsp;reader(q):<br>&nbsp;&nbsp;&nbsp;&nbsp;print(q.get())<br><br>if&nbsp;__name__&nbsp;==&nbsp;"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;q&nbsp;=&nbsp;Queue()<br>&nbsp;&nbsp;&nbsp;&nbsp;pw&nbsp;=&nbsp;Process(target=writer,&nbsp;args=(q,))<br>&nbsp;&nbsp;&nbsp;&nbsp;pr&nbsp;=&nbsp;Process(target=reader,&nbsp;args=(q,))<br>&nbsp;&nbsp;&nbsp;&nbsp;pw.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;pr.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;pw.join()<br>&nbsp;&nbsp;&nbsp;&nbsp;pr.join()

5. 锁与同步

理论讲解

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

示例代码


1
from&nbsp;multiprocessing&nbsp;import&nbsp;Lock,&nbsp;Process<br><br>lock&nbsp;=&nbsp;Lock()<br><br>def&nbsp;increment(counter):<br>&nbsp;&nbsp;&nbsp;&nbsp;lock.acquire()<br>&nbsp;&nbsp;&nbsp;&nbsp;try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter&nbsp;+=&nbsp;1<br>&nbsp;&nbsp;&nbsp;&nbsp;finally:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock.release()<br><br>if&nbsp;__name__&nbsp;==&nbsp;"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;counter&nbsp;=&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;processes&nbsp;=&nbsp;&#091;Process(target=increment,&nbsp;args=(counter,))&nbsp;for&nbsp;_&nbsp;in&nbsp;range(10)]<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;p&nbsp;in&nbsp;processes:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;p&nbsp;in&nbsp;processes:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.join()<br>&nbsp;&nbsp;&nbsp;&nbsp;print("Final&nbsp;counter:",&nbsp;counter)

6. 管道通信

理论讲解

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

示例代码


1
from&nbsp;multiprocessing&nbsp;import&nbsp;Pipe,&nbsp;Process<br><br>def&nbsp;send(pipe):<br>&nbsp;&nbsp;&nbsp;&nbsp;pipe.send('Hello')<br>&nbsp;&nbsp;&nbsp;&nbsp;pipe.close()<br><br>if&nbsp;__name__&nbsp;==&nbsp;"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;parent_conn,&nbsp;child_conn&nbsp;=&nbsp;Pipe()<br>&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;Process(target=send,&nbsp;args=(child_conn,))<br>&nbsp;&nbsp;&nbsp;&nbsp;p.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;print(parent_conn.recv())&nbsp;&nbsp;&nbsp;<em>#&nbsp;prints&nbsp;"Hello"</em><br>&nbsp;&nbsp;&nbsp;&nbsp;p.join()

7. 使用
1
subprocess

模块

理论讲解

  • 1
    subprocess

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

示例代码


1
import&nbsp;subprocess<br><br>proc&nbsp;=&nbsp;subprocess.Popen(&#091;'echo',&nbsp;'Hello&nbsp;from&nbsp;the&nbsp;child!'],&nbsp;stdout=subprocess.PIPE)<br>out,&nbsp;err&nbsp;=&nbsp;proc.communicate()<br>print(out.decode('utf-8'))

8. 进程监控与管理

理论讲解

  • 利用
    1
    psutil

    库可以获取和管理进程信息。

示例代码


1
import&nbsp;psutil<br><br><em>#&nbsp;打印所有运行中的进程</em><br>for&nbsp;proc&nbsp;in&nbsp;psutil.process_iter(&#091;'pid',&nbsp;'name']):<br>&nbsp;&nbsp;&nbsp;&nbsp;print(proc.info)

9. 进程优先级调整

理论讲解

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

示例代码


1
import&nbsp;os<br><br>os.nice(10)&nbsp;&nbsp;<em>#&nbsp;设置进程优先级为10(较低)</em>

10. 异常处理与日志记录

理论讲解

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

示例代码


1
import&nbsp;logging<br>from&nbsp;multiprocessing&nbsp;import&nbsp;Process<br><br>logging.basicConfig(level=logging.INFO)<br><br>def&nbsp;worker():<br>&nbsp;&nbsp;&nbsp;&nbsp;try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise&nbsp;Exception('Something&nbsp;went&nbsp;wrong!')<br>&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;Exception&nbsp;as&nbsp;e:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logging.error(f"Error&nbsp;in&nbsp;worker:&nbsp;{e}")<br><br>if&nbsp;__name__&nbsp;==&nbsp;"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;Process(target=worker)<br>&nbsp;&nbsp;&nbsp;&nbsp;p.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;p.join()

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


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

理论讲解

  • 进程:适用于CPU密集型任务,因为它们可以在不同的CPU核心上并行运行。
  • 线程:适用于I/O密集型任务,在单个进程内共享资源,但受GIL限制。
  • 协程:轻量级的并发模型,适用于高度I/O密集型和高并发场景,如网络请求处理。

示例代码


1
import&nbsp;asyncio<br><br>async&nbsp;def&nbsp;my_coroutine():<br>&nbsp;&nbsp;&nbsp;&nbsp;print("Starting&nbsp;coroutine")<br>&nbsp;&nbsp;&nbsp;&nbsp;await&nbsp;asyncio.sleep(1)<br>&nbsp;&nbsp;&nbsp;&nbsp;print("Coroutine&nbsp;finished")<br><br>async&nbsp;def&nbsp;main():<br>&nbsp;&nbsp;&nbsp;&nbsp;await&nbsp;asyncio.gather(my_coroutine(),&nbsp;my_coroutine())<br><br>if&nbsp;__name__&nbsp;==&nbsp;"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;asyncio.run(main())

12. 利用
1
concurrent.futures

简化多进程编程

理论讲解

  • 1
    concurrent.futures

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

示例代码


1
from&nbsp;concurrent.futures&nbsp;import&nbsp;ProcessPoolExecutor<br><br>def&nbsp;square(x):<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;x&nbsp;*&nbsp;x<br><br>if&nbsp;__name__&nbsp;==&nbsp;"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;ProcessPoolExecutor(max_workers=4)&nbsp;as&nbsp;executor:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;results&nbsp;=&nbsp;list(executor.map(square,&nbsp;range(10)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(results)

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

理论讲解

  • 死锁发生在两个或更多进程互相等待对方释放资源而无法继续执行的情况。
  • 预防措施包括使用锁的超时、资源分级和死锁检测算法。

示例代码


1
from&nbsp;multiprocessing&nbsp;import&nbsp;Lock<br><br>lock1&nbsp;=&nbsp;Lock()<br>lock2&nbsp;=&nbsp;Lock()<br><br>def&nbsp;process1():<br>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;True:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;lock1.acquire(timeout=1):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;lock2.acquire(timeout=1):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("Process&nbsp;1&nbsp;executing")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock2.release()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock1.release()<br><br>def&nbsp;process2():<br>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;True:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;lock2.acquire(timeout=1):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;lock1.acquire(timeout=1):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("Process&nbsp;2&nbsp;executing")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock1.release()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock2.release()<br><br>if&nbsp;__name__&nbsp;==&nbsp;"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;=&nbsp;Process(target=process1)<br>&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;=&nbsp;Process(target=process2)<br>&nbsp;&nbsp;&nbsp;&nbsp;p1.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;p2.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;p1.join()<br>&nbsp;&nbsp;&nbsp;&nbsp;p2.join()

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

理论讲解

  • 上下文管理器(如
    1
    with

    语句)可以自动管理资源的生命周期,避免资源泄露。

示例代码


1
from&nbsp;multiprocessing&nbsp;import&nbsp;Pool<br><br>def&nbsp;worker(num):<br>&nbsp;&nbsp;&nbsp;&nbsp;print(f"Worker&nbsp;{num}&nbsp;started")<br><br>if&nbsp;__name__&nbsp;==&nbsp;"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;Pool(processes=4)&nbsp;as&nbsp;pool:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.map(worker,&nbsp;range(4))

15. 进程安全的数据结构

理论讲解

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

示例代码


1
from&nbsp;multiprocessing&nbsp;import&nbsp;Manager<br><br>def&nbsp;add_to_list(shared_list):<br>&nbsp;&nbsp;&nbsp;&nbsp;shared_list.append(1)<br><br>if&nbsp;__name__&nbsp;==&nbsp;"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;manager&nbsp;=&nbsp;Manager()<br>&nbsp;&nbsp;&nbsp;&nbsp;shared_list&nbsp;=&nbsp;manager.list()<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;processes&nbsp;=&nbsp;&#091;]<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;_&nbsp;in&nbsp;range(10):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;Process(target=add_to_list,&nbsp;args=(shared_list,))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.start()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processes.append(p)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;p&nbsp;in&nbsp;processes:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.join()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;print(shared_list)

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

给TA打赏
共{{data.count}}人
人已打赏
安全运维

安全运维之道:发现、解决问题的有效闭环

2024-4-14 20:59:36

安全运维

稳定性建设 – 架构优化的关键策略

2025-2-11 17:15:56

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索