热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

进程管理:并发、并行、子进程启动与进程池应用

本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。

一、进程概述


进程是操作系统进行资源分配和调度的基本单位,它是程序执行的一个实例。即使在单CPU环境下,操作系统也能通过时间片轮转等机制实现多任务的并发执行。进程的存在使得现代计算机能够高效地管理和执行多个任务。


二、进程与程序的关系


程序是静态的指令集合,而进程是程序的一次动态执行过程。同一程序多次运行会产生多个独立的进程,每个进程拥有自己独立的内存空间和系统资源。


三、并发与并行


并发是指多个任务在同一时间段内交错执行,而并行是指多个任务同时执行。在单核CPU上,通过多道技术实现并发;在多核CPU上,可以通过每个核心执行不同的任务来实现并行。两者在用户体验上都是“同时”运行的。


四、同步与异步


同步调用是指调用者在没有得到结果前不会返回,而异步调用则会在调用后立即返回,结果通过回调或其他方式通知调用者。阻塞调用会使调用者在等待结果期间暂停执行,而非阻塞调用则不会。


五、Python中的多进程实现


1. multiprocessing模块


Python的multiprocessing模块提供了丰富的API来创建和管理进程。该模块支持子进程的创建、进程间的通信和同步等操作。与线程不同,进程之间没有共享状态,每个进程都有自己独立的内存空间。


2. Process类


Process类用于创建子进程。主要方法包括:start() 启动进程,join() 主进程等待子进程结束,terminate() 强制终止进程等。主要属性包括:pid 进程ID,name 进程名称等。


3. 创建并启动子进程


from multiprocessing import Process
import time

def task(name):
print(f'{name} is running')
time.sleep(2)

if __name__ == '__main__':
p = Process(target=task, args=('egon',))
p.start()
print('主')

4. 通过继承Process类创建子进程


from multiprocessing import Process
import time

class MyProcess(Process):
def __init__(self, name):
super().__init__()
self.name = name

def run(self):
print(f'{self.name} is running')
time.sleep(2)

if __name__ == '__main__':
p = MyProcess('egon')
p.start()
print('主')

5. 进程间的通信与同步


进程间通信可以通过Queue、Pipe等机制实现。同步可以通过Lock、Event等机制实现。


6. 进程池(Pool)


进程池可以预先创建一组进程,当有任务提交时,从池中取出一个空闲进程来执行任务。进程池适用于任务量大但核心数有限的场景。


from concurrent.futures import ProcessPoolExecutor
import time, os

def run(name, n):
print(f'{name} is running {os.getpid()}')
time.sleep(1)
return n ** 2

if __name__ == '__main__':
with ProcessPoolExecutor(4) as p:
results = [p.submit(run, f'alex {i}', i) for i in range(10)]
for future in results:
print(future.result())
print('主', os.getpid())

六、Socket并发编程示例


通过多进程可以实现Socket服务端与多个客户端的并发通信。


服务端


from socket import *
from multiprocessing import Process

server = socket(AF_INET, SOCK_STREAM)
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 8080))
server.listen(5)

def talk(conn):
while True:
try:
msg = conn.recv(1024)
if not msg:
break
conn.send(msg.upper())
except Exception:
break

if __name__ == '__main__':
while True:
conn, client_addr = server.accept()
p = Process(target=talk, args=(conn,))
p.start()

客户端


from socket import *

client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1', 8080))

while True:
msg = input('>>: ').strip()
if not msg:
continue
client.send(msg.encode('utf-8'))
msg = client.recv(1024)
print(msg.decode('utf-8'))

七、总结


本文详细介绍了进程的概念、多进程的实现方式以及Python中多进程的相关技术。通过这些技术,可以有效地管理和调度多个任务,提高程序的并发性能。


推荐阅读
  • Python网络编程:深入探讨TCP粘包问题及解决方案
    本文详细探讨了TCP协议下的粘包现象及其产生的原因,并提供了通过自定义报头解决粘包问题的具体实现方案。同时,对比了TCP与UDP协议在数据传输上的不同特性。 ... [详细]
  • 本文详细介绍了如何在Vue项目中集成和配置XGPlayer视频插件,包括安装步骤、基本配置以及常见问题的解决方法。 ... [详细]
  • 前端技术分享——利用Canvas绘制鼠标轨迹
    作为一名前端开发者,我已经积累了Vue、React、正则表达式、算法以及小程序等方面的技能,但Canvas一直是我的盲区。因此,我在2018年为自己设定了一个新的学习目标:掌握Canvas,特别是如何使用它来创建CSS3难以实现的动态效果。 ... [详细]
  • Python Selenium WebDriver 浏览器驱动详解与实践
    本文详细介绍了如何使用Python结合Selenium和unittest构建自动化测试框架,重点解析了WebDriver浏览器驱动的配置与使用方法,涵盖Chrome、Firefox、IE/Edge等主流浏览器。 ... [详细]
  • 使用 Babylon.js 实现地球模型与切片地图交互(第三部分)
    本文继续探讨在上一章节中构建的地球模型基础上,如何通过自定义的 `CameraEarthWheelControl` 类来实现更精细的地图缩放控制。我们将深入解析该类的实现细节,并展示其在实际项目中的应用。 ... [详细]
  • 本文介绍了如何在React应用中实现延迟加载以提高性能,以及如何利用自定义Hook和高阶组件(HOC)来增强组件功能。通过这些技术,开发者可以构建更加高效和可维护的应用。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • Zabbix自定义监控与邮件告警配置实践
    本文详细介绍了如何在Zabbix中添加自定义监控项目,配置邮件告警功能,并解决测试告警时遇到的邮件不发送问题。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 本文介绍了如何通过命令行有效地终止所有 Node.js 进程实例,以解决因端口冲突或其他服务冲突导致的问题。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 根据官方定义,RxJava是一种用于异步编程和可观察数据流的API。其核心特性在于流式处理能力和丰富的操作符支持。 ... [详细]
  • Django与Python及其他Web框架的对比
    本文详细介绍了Django与其他Python Web框架(如Flask和Tornado)的区别,并探讨了Django的基本使用方法及与其他语言(如PHP)的比较。 ... [详细]
author-avatar
sendymylove睛飘益
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有